从numpy矩阵中查找值列表的行方向索引

时间:2017-12-20 07:03:23

标签: python numpy

使用var arr = Array.from({length:1000000}, (_,i) => (i+1)); function shuffleArray(array) { for (var i = array.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); [array[i], array[j]] = [array[j], array[i]]; } } shuffleArray(arr); console.log(arr);是否有一种智能方法可以在矩阵中查找值列表的索引?我们总是可以以迭代的方式完成它,但是有没有快速而快速的方法可供使用?

我们有一个矩阵:

numpy

和一个清单:

[[1,2,3],[4,5,6],[7,8,9],[10,11,12]]

我们需要的是矩阵的相应行中的3,4,7和11的索引,即[3,4,7,11]

显然,这是一个用迭代方法编写的简单代码,但我们正在寻找任何现成的实现。

提前致谢。

3 个答案:

答案 0 :(得分:2)

对于您的示例,这有效:

In [17]: import numpy as np

In [18]: a = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])

In [19]: l = [3,4,7,11]

In [20]: np.where(a == np.array(l)[:, None])[1]
Out[20]: array([2, 0, 0, 1])

答案 1 :(得分:1)

您可以使用numpy.argwhere获取所需的索引

import numpy as np

arr = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
search_list = [3,4,7,11]
index_arr = [np.argwhere(arr==x).flatten()[1] for x in search_list]
#index_arr [2, 0, 0, 1]

答案 2 :(得分:1)

这是@ Akavall解决方案的重复安全版本。如果有多个值出现,则返回第一个索引:

a = [[1,2,3],[4,5,6],[7,8,9],[10,11,12]]
b = [3,4,7,11]

# introduce a repeated value 
a[1][1] = a[1][0]
a
# [[1, 2, 3], [4, 4, 6], [7, 8, 9], [10, 11, 12]]

i, j = np.where(a == np.c_[b])
j[i.searchsorted(range(len(b)))]
# array([2, 0, 0, 1])