用列表的值替换numpy索引数组的值 [英] Replace values of a numpy index array with values of a list

查看:718
本文介绍了用列表的值替换numpy索引数组的值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设您有一个numpy数组和一个列表:

Suppose you have a numpy array and a list:

>>> a = np.array([1,2,2,1]).reshape(2,2)
>>> a
array([[1, 2],
       [2, 1]])
>>> b = [0, 10]

我想替换数组中的值,以便1取而代之的是0和2乘10。

I'd like to replace values in an array, so that 1 is replaced by 0, and 2 by 10.

我在这里发现了类似的问题 - http://mail.python.org/pipermail//tutor/2011-September/085392.html

I found a similar problem here - http://mail.python.org/pipermail//tutor/2011-September/085392.html

但是使用这个解决方案:

But using this solution:

for x in np.nditer(a):
    if x==1:
        x[...]=x=0
    elif x==2:
        x[...]=x=10

给我一​​个错误:

ValueError: assignment destination is read-only

我想这是因为我无法真正写入numpy数组。

I guess that's because I can't really write into a numpy array.

PS numpy数组的实际大小为514乘504,列表为8.

P.S. The actual size of the numpy array is 514 by 504 and of the list is 8.

推荐答案

而不是一个一个地替换值一,可以像这样重新映射整个数组:

Instead of replacing the values one by one, it is possible to remap the entire array like this:

import numpy as np
a = np.array([1,2,2,1]).reshape(2,2)
# palette must be given in sorted order
palette = [1, 2]
# key gives the new values you wish palette to be mapped to.
key = np.array([0, 10])
index = np.digitize(a.ravel(), palette, right=True)
print(key[index].reshape(a.shape))

收益率

[[ 0 10]
 [10  0]]






上述想法归功于@JoshAdel 。它明显快于我原来的答案:


Credit for the above idea goes to @JoshAdel. It is significantly faster than my original answer:

import numpy as np
import random
palette = np.arange(8)
key = palette**2
a = np.array([random.choice(palette) for i in range(514*504)]).reshape(514,504)

def using_unique():
    palette, index = np.unique(a, return_inverse=True)
    return key[index].reshape(a.shape)

def using_digitize():
    index = np.digitize(a.ravel(), palette, right=True)
    return key[index].reshape(a.shape)

if __name__ == '__main__':
    assert np.allclose(using_unique(), using_digitize())

我用这种方式对这两个版本进行基准测试:

I benchmarked the two versions this way:

In [107]: %timeit using_unique()
10 loops, best of 3: 35.6 ms per loop
In [112]: %timeit using_digitize()
100 loops, best of 3: 5.14 ms per loop

这篇关于用列表的值替换numpy索引数组的值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆