替换引用列表中的数组值

2024-04-20 00:12:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用“ref”列表替换“data”数组的值:

import numpy as np

data = np.array([[1, 1 , 0 , 0 , 0 , 0 , 1 , 0],
                 [1, 1 , 1 , 1 , 9 , 1 , 1 , 0],
                 [1, 1 , 1 , 1 , 1 , 1 , 1 , 0],
                 [0, 0 , 1 , 1 , 1 , 1 , 1 , 0],
                 [0, 0 , 1 , 1 , 1 , 1 , 1 , 1],
                 [1, 1 , 1 , 1 , 1 , 1 , 1 , 0],
                 [1, 1 , 0 , 0 , 0 , 0 , 0 , 0],
                 [1, 1 , 0 , 0 , 0 , 0 , 1 , 0],
                 [1, 1 , 1 , 15 , 1 , 1 , 1 , 0],
                 [1, 1 , 1 , 1 , 1 , 1 , 1 , 0],
                 [0, 0 , 1 , 1 , 1 , 1 , 1 , 0],
                 [0, 0 , 1 , 1 , 12 , 1 , 1 , 1],
                 [1, 1 , 1 , 1 , 1 , 1 , 1 , 0],
                 [1, 1 , 0 , 0 , 0 , 0 , 0 , 0]])

ref = [9,12]

我试着:

data[data==ref] = 0

print data

但没有变化。你知道吗

预期数组中的9和12值应替换为0。 最快的方法是什么?你知道吗


Tags: 方法importnumpyref列表dataasnp
3条回答

遍历numpy数组非常慢,比遍历Python列表慢一个数量级。你知道吗

使用以下构造,您可以使用numpy.in1d()方法(http://docs.scipy.org/doc/numpy/reference/generated/numpy.in1d.html)将所有内容都保存在numpy中

以下内容将ref中的所有元素设置为-1,并将其简单地更改为设置为0

data[np.in1d(data, ref).reshape(data.shape)] = -1

另一种方法是:

data[np.logical_or(*(data == e for e in ref))] = 0

您可以在值上循环并使用np.where屏蔽数组以设置值:

In [67]:

ref = [9,12]
for e in ref:
    data[data == e] = 0
data
Out[67]:
array([[ 1,  1,  0,  0,  0,  0,  1,  0],
       [ 1,  1,  1,  1,  0,  1,  1,  0],
       [ 1,  1,  1,  1,  1,  1,  1,  0],
       [ 0,  0,  1,  1,  1,  1,  1,  0],
       [ 0,  0,  1,  1,  1,  1,  1,  1],
       [ 1,  1,  1,  1,  1,  1,  1,  0],
       [ 1,  1,  0,  0,  0,  0,  0,  0],
       [ 1,  1,  0,  0,  0,  0,  1,  0],
       [ 1,  1,  1, 15,  1,  1,  1,  0],
       [ 1,  1,  1,  1,  1,  1,  1,  0],
       [ 0,  0,  1,  1,  1,  1,  1,  0],
       [ 0,  0,  1,  1,  0,  1,  1,  1],
       [ 1,  1,  1,  1,  1,  1,  1,  0],
       [ 1,  1,  0,  0,  0,  0,  0,  0]])

失败的原因:

data[data==ref] = 0

如果将数组与一个列表进行比较,会得到一个False的标量布尔值,这就是为什么它什么也不做的原因。你知道吗

只是为了证明@haave的答案是有效的,在我看来,洋葱更好:

In [73]:

data[np.in1d(data, ref).reshape(data.shape)] = 0
data
Out[73]:
array([[ 1,  1,  0,  0,  0,  0,  1,  0],
       [ 1,  1,  1,  1,  0,  1,  1,  0],
       [ 1,  1,  1,  1,  1,  1,  1,  0],
       [ 0,  0,  1,  1,  1,  1,  1,  0],
       [ 0,  0,  1,  1,  1,  1,  1,  1],
       [ 1,  1,  1,  1,  1,  1,  1,  0],
       [ 1,  1,  0,  0,  0,  0,  0,  0],
       [ 1,  1,  0,  0,  0,  0,  1,  0],
       [ 1,  1,  1, 15,  1,  1,  1,  0],
       [ 1,  1,  1,  1,  1,  1,  1,  0],
       [ 0,  0,  1,  1,  1,  1,  1,  0],
       [ 0,  0,  1,  1,  0,  1,  1,  1],
       [ 1,  1,  1,  1,  1,  1,  1,  0],
       [ 1,  1,  0,  0,  0,  0,  0,  0]])

相关问题 更多 >