另一个1D numpy数组中包含的元素的具有True值的布尔2D numpy数组的掩码



以下面的例子为例。我有一个数组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是测试的形状,因此这将在非常大的数组上消耗一些内存

最新更新