我有一个多维numpy数组,我想把它的一些元素构造成一维数组。我需要采用的元素由它们的索引给出,例如:
inds = [(0,0), (0,1), (1,1), (1,0), (0,2)]
我以一种简单的方式解决它:
ls = []
for i, j in inds:
ls += [a[i,j]]
它给出了期望的结果。但是,我意识到这个解决方案对我来说太慢了。是否有可能以更有效的方式做同样的事情?
答案 0 :(得分: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]])
i
和j
包含inds
数组的第一和第二坐标的序列:
In [20]: i
Out[20]: [0, 0, 1, 1, 0]
In [21]: j
Out[21]: [0, 1, 1, 0, 2]
您可以使用这些来从a
中提取相应的值:
In [22]: a[i, j]
Out[22]: array([0, 1, 6, 5, 2])
如果您的代码中已有inds
,则可以使用i
将元组列表分为j
和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)
或者,如果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]])
您只需将inds
的转置分配给i, 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])