在多维numpy数组中查找多个查询的索引

时间:2016-08-26 06:19:37

标签: python arrays numpy multidimensional-array

我正在寻找一种在多维数组中查找查询数组索引的方法。例如:

arr = np.array([[17,  5, 19,  9],
   [18, 13,  3,  7],
   [ 8,  1,  4,  2],
   [ 8,  9,  7, 19],
   [ 6, 11,  8,  5],
   [11, 16, 13, 18],
   [ 0,  1,  2,  9],
   [ 1,  7,  4,  6]])

我可以找到一个查询的索引:

np.where(arr==1)
# (array([2, 6, 7]), array([1, 1, 0]))

对于替换以下for循环的多个值,是否有任何numpy解决方案?

for q in queries:
    np.where(arr==q)

如果数组和查询都是一维的,我可以使用searchsorted作为this answer,但它不适用于多维数组。

2 个答案:

答案 0 :(得分:2)

IIUC你可以试试这个:

In[19]:np.where((arr==4)|(arr==5))
Out[19]: (array([0, 2, 4, 7], dtype=int64), array([1, 2, 3, 2], dtype=int64))

答案 1 :(得分:1)

您可以通过压缩where函数的结果然后使用*解除引用运算符来获取每个匹配值的索引。

arr = np.array([[17,  5, 19,  9],
                [18, 13,  3,  7],
                [ 8,  1,  4,  2],  # (2, 1)
                [ 8,  9,  7, 19],
                [ 6, 11,  8,  5],
                [11, 16, 13, 18],
                [ 0,  1,  2,  9],  # (6, 1)
                [ 1,  7,  4,  6]])  # (7, 0)

>>> zip(*np.where(arr == 1))
[(2, 1), (6, 1), (7, 0)]

我不确定您的预期输出是什么,但您可以使用字典理解来显示给定数字集的索引位置,例如:

>>> {n: zip(*np.where(arr == n)) for n in range(5)}
{0: [(6, 0)],
 1: [(2, 1), (6, 1), (7, 0)],
 2: [(2, 3), (6, 2)],
 3: [(1, 2)],
 4: [(2, 2), (7, 2)]}