我有一个(N,K)维的numpy.ndarray“master”,我想在其中找到几个K维数组的出现,假设我有M个,存储在(M,K)维数组“search”中。
假设例如N=9,K=2,M=3,并且
master = array([[0, 0], [1, 0], [2, 0], [0, 1], [1, 1], [2, 1], [0, 2], [1, 2], [2, 2]])
search = array([[1, 2], [2, 0], [4, -2]])
这里我想要的是类似array([7, 2])
或array([2, 7])
的东西,因为主数组的索引2和7出现在搜索数组中。
我第一次尝试通过写np.argwhere(np.all(np.isin(master, search), axis=1)).ravel()
来使用np.isin
,但这返回了所有值都属于search
但不一定属于同一个元素的索引...
另一种方法似乎也可以,但它使用了Python的列表解析和嵌套循环,所以我认为这是非常次优的:
np.argwhere(np.any(np.array([[np.array_equal(master[i], search[j])
for i in range(N)]
for j in range(M)]),
axis=0)).ravel()
有没有一种方法可以只使用Numpy标准函数来做到这一点?我有相当大的条目,所以理解列表太慢...
1条答案
按热度按时间enxuqcxy1#
让我们把它分成多个步骤。
1.使用
==
检查search
和master
中每个项之间的相等性。为了在元素上做到这一点,我们需要使用search[:,None]
使search
成为一个2D数组。1.使用轴2上的
all
执行逻辑AND,检查search
中的两项是否都等于master
中的两项。1.使用轴0上的
any
执行逻辑OR,将结果折叠以获得search
中每个项的True
或False
值。1.最后,使用
np.where
查找索引。使用命名步骤:
一起来: