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

标签 python numpy optimization

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

inds = [(0,0), (0,1), (1,1), (1,0), (0,2)] 

我直接解决了:

ls = [] 
for i, j in inds:
   ls += [a[i,j]]

它给出了想要的结果。但是,我已经意识到这个解决方案对于我的目的来说太慢了。是否有可能以更有效的方式做同样的事情?

最佳答案

numpy 数组可以用序列索引(更一般地,numpy 数组)。

例如,这是我的数组a

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

ij 保存您的 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,您可以使用 zip< 将元组列表分成 ij/:

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])

关于python - 如何有效地从 numpy 数组中提取由索引给出的元素列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30182076/

相关文章:

java - MD5 哈希更快

python - 在 Python 中需要保留重复项时比较两个列表中的元素

python - 值错误 : axes don't match array - Can't transpose an array

python - Numpy:根据条件获取最小值的索引

c++ - isdigit() 总是通过检查

c - 减少 C 程序的大小以适应 qr 代码

Python编码风格

python - 当根类别具有相同的子类别时,如何在 django 中实现类别/子类别?

Python 拓扑排序使用列表指示边

python - 具有滞后值(value)的条件产品的 Pandas cumsum?