numpy 当值是数组时,查找主数组中的值数组的索引

sigwle7e  于 2023-06-29  发布在  其他
关注(0)|答案(1)|浏览(130)

我有一个(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标准函数来做到这一点?我有相当大的条目,所以理解列表太慢...

enxuqcxy

enxuqcxy1#

让我们把它分成多个步骤。
1.使用==检查searchmaster中每个项之间的相等性。为了在元素上做到这一点,我们需要使用search[:,None]使search成为一个2D数组。
1.使用轴2上的all执行逻辑AND,检查search中的两项是否都等于master中的两项。
1.使用轴0上的any执行逻辑OR,将结果折叠以获得search中每个项的TrueFalse值。
1.最后,使用np.where查找索引。
使用命名步骤:

import numpy as np

master = np.array([[0, 0], [1, 0], [2, 0], [0, 1], [1, 1], [2, 1], [0, 2], [1, 2], [2, 2]])
search = np.array([[1, 2], [2, 0], [4, -2]])
step1 = master == search[:,None]
step2 = step1.all(2)
step3 = step2.any(0)
step4 = np.where(step3)[0]  # [2, 7]

一起来:

import numpy as np

master = np.array([[0, 0], [1, 0], [2, 0], [0, 1], [1, 1], [2, 1], [0, 2], [1, 2], [2, 2]])
search = np.array([[1, 2], [2, 0], [4, -2]])
res = np.where((master == search[:,None]).all(2).any(0))[0]   # [2, 7]

相关问题