以下面的例子为例。我有一个数组test
,想要为所有等于ref
元素的元素获得一个True的布尔掩码。
import numpy as np
test = np.array([[2, 3, 1, 0], [5, 4, 2, 3], [6, 7, 5 ,4]])
ref = np.array([3, 4, 5])
我正在寻找类似的东西
mask = (test == ref[0]) | (test == ref[1]) | (test == ref[2])
在这种情况下应该产生
>>> print(mask)
[[False, True, False, False],
[ True, True, False, True],
[False, False, True, True]]
但不必求助于任何循环。
Numpy附带了一个函数isin,它正是完成这个的
np.isin(test, ref)
返回
array([[False, True, False, False],
[ True, True, False, True],
[False, False, True, True]])
您可以使用numpy广播:
mask = (test[:,None] == ref[:,None]).any(1)
输出:
array([[False, True, False, False],
[ True, True, False, True],
[False, False, True, True]])
注意。这比numpy.isin
更快,但会创建一个(X,X,Y(大小的中间数组,其中X,Y是测试的形状,因此这将在非常大的数组上消耗一些内存