将标量值分配给另一个数组中的numpy数组的所有元素

时间:2018-11-30 06:01:41

标签: python numpy

例如,我有一个numpy数组a = np.arange(10),我需要将ignore = [2,3,4]中的值分配为数字255,如下所示:

a = np.arange(10)
ignore_value = [3,4,5]
a[a in ignore_value] = 255 # what is the correct way to implement this?

上面程序的最后一行不能被Python3.5接受,但是它显示了我想要做的事情。

编辑:

我找到了一个解决方案,但没有向量化。

for el in ignore_value:
    a[a == el] = 255

这看起来真的很丑,而且很慢,因为这里有一个for循环,所以我有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

In [500]: a = np.arange(10)
In [501]: ignore_value = [3,4,5]
In [502]: np.isin(a, ignore_value)
Out[502]: 
array([False, False, False,  True,  True,  True, False, False, False,
       False])
In [503]: a[np.isin(a, ignore_value)]=255
In [504]: a
Out[504]: array([  0,   1,   2, 255, 255, 255,   6,   7,   8,   9])

您还可以使用以下方法构造蒙版:

In [506]: a[:,None]==ignore_value
Out[506]: 
array([[False, False, False],
       [False, False, False],
       [False, False, False],
       [ True, False, False],
       [False,  True, False],
       [False, False,  True],
       [False, False, False],
       [False, False, False],
       [False, False, False],
       [False, False, False]])
In [507]: (a[:,None]==ignore_value).any(axis=1)
Out[507]: 
array([False, False, False,  True,  True,  True, False, False, False,
       False])

答案 1 :(得分:2)

您可以将numpy.isin与布尔索引一起使用。

>>> a = np.arange(10)
>>> ignore_value = [3,4,5]
>>> a[np.isin(a, ignore_value)] = 255
>>> a
array([  0,   1,   2, 255, 255, 255,   6,   7,   8,   9])

...或使用numpy.where

>>> a = np.arange(10)
>>> a = np.where(np.isin(a, ignore_value), 255, a)
>>> a
array([  0,   1,   2, 255, 255, 255,   6,   7,   8,   9])

在两种情况下,np.isin(a, ignore_value)都会为您提供一个布尔数组,指示aignore_value中出现值的位置。

>>> np.isin(a, ignore_value)
array([False, False, False,  True,  True,  True, False, False, False, False])