我正在寻找一种在多维数组中查找查询数组索引的方法。例如:
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,但它不适用于多维数组。
答案 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)]}