如何有效地从numpy数组中提取其索引给出的元素列表?

Rom*_*man 2 python optimization numpy

我有一个多维的numpy数组,我想把它的一些元素构造成一维数组.我需要采取的元素由它们的索引给出,例如:

inds = [(0,0), (0,1), (1,1), (1,0), (0,2)] 
Run Code Online (Sandbox Code Playgroud)

我以一种简单的方式解决它:

ls = [] 
for i, j in inds:
   ls += [a[i,j]]
Run Code Online (Sandbox Code Playgroud)

它给出了期望的结果.但是,我意识到这个解决方案对我来说太慢了.是否有可能以更有效的方式做同样的事情?

War*_*ser 5

numpy数组可以用序列索引(更常见的是numpy数组).

例如,这是我的数组 a

In [19]: a
Out[19]: 
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
Run Code Online (Sandbox Code Playgroud)

ij保持inds数组的第一个和第二个坐标的序列:

In [20]: i
Out[20]: [0, 0, 1, 1, 0]

In [21]: j
Out[21]: [0, 1, 1, 0, 2]
Run Code Online (Sandbox Code Playgroud)

您可以使用它们来提取相应的值a:

In [22]: a[i, j]
Out[22]: array([0, 1, 6, 5, 2])
Run Code Online (Sandbox Code Playgroud)

如果您inds的代码已经存在,则可以将元组列表分成以下内容ij使用zip:

In [23]: inds
Out[23]: [(0, 0), (0, 1), (1, 1), (1, 0), (0, 2)]

In [24]: i, j = zip(*inds)

In [25]: i
Out[25]: (0, 0, 1, 1, 0)

In [26]: j
Out[26]: (0, 1, 1, 0, 2)
Run Code Online (Sandbox Code Playgroud)

或者,如果inds是一个具有形状(n,2)的数组,如下所示:

In [27]: inds = np.array(inds)

In [28]: inds
Out[28]: 
array([[0, 0],
       [0, 1],
       [1, 1],
       [1, 0],
       [0, 2]])
Run Code Online (Sandbox Code Playgroud)

你可以简单地将转置分配indsi, j:

In [33]: i, j = inds.T

In [34]: i
Out[34]: array([0, 0, 1, 1, 0])

In [35]: j
Out[35]: array([0, 1, 1, 0, 2])

In [36]: a[i, j]
Out[36]: array([0, 1, 6, 5, 2])
Run Code Online (Sandbox Code Playgroud)