屏蔽掉数组中的特定值
Mask out specific values from an array
示例:
我有一个数组:
array([[1, 2, 0, 3, 4],
[0, 4, 2, 1, 3],
[4, 3, 2, 0, 1],
[4, 2, 3, 0, 1],
[1, 0, 2, 3, 4],
[4, 3, 2, 0, 1]], dtype=int64)
我有一组(可变长度,顺序无关紧要)"bad" 个值:
{2, 3}
我想要 return 隐藏这些值的掩码:
array([[False, True, False, True, False],
[False, False, True, False, True],
[False, True, True, False, False],
[False, True, True, False, False],
[False, False, True, True, False],
[False, True, True, False, False]], dtype=bool)
在 NumPy 中执行此操作的最简单方法是什么?
可能还有比这更简单的方法。但这可以是一种方式:
import numpy as np
a = np.array([[1, 2, 0, 3, 4],
[0, 4, 2, 1, 3],
[4, 3, 2, 0, 1],
[4, 2, 3, 0, 1],
[1, 0, 2, 3, 4],
[4, 3, 2, 0, 1]], dtype=np.int64)
f = np.vectorize(lambda x: x in {2,3})
print f(a)
输出:
[[False True False True False]
[False False True False True]
[False True True False False]
[False True True False False]
[False False True True False]
[False True True False False]]
使用 np.in1d
为我们提供此类匹配事件的扁平掩码,然后重新整形为所需输出的输入数组形状,就像这样 -
np.in1d(a,[2,3]).reshape(a.shape)
请注意,我们需要以列表或数组的形式输入要搜索的数字。
样本运行-
In [5]: a
Out[5]:
array([[1, 2, 0, 3, 4],
[0, 4, 2, 1, 3],
[4, 3, 2, 0, 1],
[4, 2, 3, 0, 1],
[1, 0, 2, 3, 4],
[4, 3, 2, 0, 1]])
In [6]: np.in1d(a,[2,3]).reshape(a.shape)
Out[6]:
array([[False, True, False, True, False],
[False, False, True, False, True],
[False, True, True, False, False],
[False, True, True, False, False],
[False, False, True, True, False],
[False, True, True, False, False]], dtype=bool)
2018 版:numpy.isin
使用 NumPy 内置 np.isin
(introduced in 1.13.0
) 来保持形状,因此不需要我们之后重新整形 -
In [153]: np.isin(a,[2,3])
Out[153]:
array([[False, True, False, True, False],
[False, False, True, False, True],
[False, True, True, False, False],
[False, True, True, False, False],
[False, False, True, True, False],
[False, True, True, False, False]])
In [965]: np.any([x==i for i in (2,3)],axis=0)
Out[965]:
array([[False, True, False, True, False],
[False, False, True, False, True],
[False, True, True, False, False],
[False, True, True, False, False],
[False, False, True, True, False],
[False, True, True, False, False]], dtype=bool)
这确实会迭代,但如果 (2,3)
集很小(相对于 x
的大小),这会相对较快。事实上对于小 arr2
,np.in1d
这样做:
mask = np.zeros(len(ar1), dtype=np.bool)
for a in ar2:
mask |= (ar1 == a)
由此创建一个掩码数组:
In [970]: np.ma.MaskedArray(x,mask)
Out[970]:
masked_array(data =
[[1 -- 0 -- 4]
[0 4 -- 1 --]
[4 -- -- 0 1]
[4 -- -- 0 1]
[1 0 -- -- 4]
[4 -- -- 0 1]],
mask =
[[False True False True False]
[False False True False True]
[False True True False False]
[False True True False False]
[False False True True False]
[False True True False False]],
fill_value = 999999)
示例:
我有一个数组:
array([[1, 2, 0, 3, 4],
[0, 4, 2, 1, 3],
[4, 3, 2, 0, 1],
[4, 2, 3, 0, 1],
[1, 0, 2, 3, 4],
[4, 3, 2, 0, 1]], dtype=int64)
我有一组(可变长度,顺序无关紧要)"bad" 个值:
{2, 3}
我想要 return 隐藏这些值的掩码:
array([[False, True, False, True, False],
[False, False, True, False, True],
[False, True, True, False, False],
[False, True, True, False, False],
[False, False, True, True, False],
[False, True, True, False, False]], dtype=bool)
在 NumPy 中执行此操作的最简单方法是什么?
可能还有比这更简单的方法。但这可以是一种方式:
import numpy as np
a = np.array([[1, 2, 0, 3, 4],
[0, 4, 2, 1, 3],
[4, 3, 2, 0, 1],
[4, 2, 3, 0, 1],
[1, 0, 2, 3, 4],
[4, 3, 2, 0, 1]], dtype=np.int64)
f = np.vectorize(lambda x: x in {2,3})
print f(a)
输出:
[[False True False True False]
[False False True False True]
[False True True False False]
[False True True False False]
[False False True True False]
[False True True False False]]
使用 np.in1d
为我们提供此类匹配事件的扁平掩码,然后重新整形为所需输出的输入数组形状,就像这样 -
np.in1d(a,[2,3]).reshape(a.shape)
请注意,我们需要以列表或数组的形式输入要搜索的数字。
样本运行-
In [5]: a
Out[5]:
array([[1, 2, 0, 3, 4],
[0, 4, 2, 1, 3],
[4, 3, 2, 0, 1],
[4, 2, 3, 0, 1],
[1, 0, 2, 3, 4],
[4, 3, 2, 0, 1]])
In [6]: np.in1d(a,[2,3]).reshape(a.shape)
Out[6]:
array([[False, True, False, True, False],
[False, False, True, False, True],
[False, True, True, False, False],
[False, True, True, False, False],
[False, False, True, True, False],
[False, True, True, False, False]], dtype=bool)
2018 版:numpy.isin
使用 NumPy 内置 np.isin
(introduced in 1.13.0
) 来保持形状,因此不需要我们之后重新整形 -
In [153]: np.isin(a,[2,3])
Out[153]:
array([[False, True, False, True, False],
[False, False, True, False, True],
[False, True, True, False, False],
[False, True, True, False, False],
[False, False, True, True, False],
[False, True, True, False, False]])
In [965]: np.any([x==i for i in (2,3)],axis=0)
Out[965]:
array([[False, True, False, True, False],
[False, False, True, False, True],
[False, True, True, False, False],
[False, True, True, False, False],
[False, False, True, True, False],
[False, True, True, False, False]], dtype=bool)
这确实会迭代,但如果 (2,3)
集很小(相对于 x
的大小),这会相对较快。事实上对于小 arr2
,np.in1d
这样做:
mask = np.zeros(len(ar1), dtype=np.bool)
for a in ar2:
mask |= (ar1 == a)
由此创建一个掩码数组:
In [970]: np.ma.MaskedArray(x,mask)
Out[970]:
masked_array(data =
[[1 -- 0 -- 4]
[0 4 -- 1 --]
[4 -- -- 0 1]
[4 -- -- 0 1]
[1 0 -- -- 4]
[4 -- -- 0 1]],
mask =
[[False True False True False]
[False False True False True]
[False True True False False]
[False True True False False]
[False False True True False]
[False True True False False]],
fill_value = 999999)