在数组中行智能元素搜索

时间:2015-08-24 12:00:55

标签: python numpy

我有一个向量(比如v = (1, 5, 7))和一个数组。

 a = [ [1, 2, 3],
       [4, 5, 6], 
       [7, 8, 9] ]

在a中相应行中查找向量v中元素索引的最有效方法是什么。例如,这里的输出将是 b = (0, 1, 0),因为1位于第1行的0th索引,依此类推。

3 个答案:

答案 0 :(得分:5)

您可以将v转换为包含[:,None]的列向量,然后与a进行比较以引入broadcasting,最后使用np.where来获得最终结果输出为指数 -

np.where(a == v[:,None])[1]

示例运行 -

In [34]: a
Out[34]: 
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

In [35]: v
Out[35]: array([1, 5, 7])

In [36]: np.where(a == v[:,None])[1]
Out[36]: array([0, 1, 0])

如果a中的一行中有多个元素与v中的相应元素匹配,则可以使用np.argmax获取每行中第一个匹配的索引,像这样 -

np.argmax(a == v[:,None],axis=1)

示例运行 -

In [57]: a
Out[57]: 
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 7]])

In [58]: v
Out[58]: array([1, 5, 7])

In [59]: np.argmax(a == v[:,None],axis=1)
Out[59]: array([0, 1, 0])

答案 1 :(得分:1)

>>> a = [ [1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> v = (1, 5, 7)
>>> b = tuple([a[id].index(val) for id, val in enumerate(v)])
>>> b
(0, 1, 0)

答案 2 :(得分:0)

您可以使用列表理解:

[a[idx].index(val) for idx, val in enumerate(v)]

其中enumerate返回一个可迭代的索引和值本身,index返回正确行中val的第一个外观的索引。

如果你必须得到一个元组,因为返回值最后转换它:

b = tuple([a[idx].index(val) for idx, val in enumerate(v)])

请注意,如果在val的正确行中找不到a,索引可能会引发ValueError。