例如,我有一个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
循环,所以我有更好的方法吗?
答案 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)
都会为您提供一个布尔数组,指示a
在ignore_value
中出现值的位置。
>>> np.isin(a, ignore_value)
array([False, False, False, True, True, True, False, False, False, False])