通过没有循环的二维索引数组索引二维 numpy 数组 [英] Index 2D numpy array by a 2D array of indices without loops
问题描述
我正在寻找一种矢量化方法来通过索引的 numpy.array
索引 numpy.array
.
例如:
将 numpy 导入为 npa = np.array([[0,3,4],[5,6,0],[0,1,9]])inds = np.array([[0,1],[1,2],[0,2]])
我想构建一个新数组,使得该数组中的每一行 (i) 都是数组 a
的一行 (i),由数组 inds(i) 的行索引.我想要的输出是:
array([[ 0., 3.], # a[0][:,[0,1]][ 6., 0.], # a[1][:,[1,2]][ 0., 9.]]) # a[2][:,[0,2]]
我可以用一个循环来实现:
def loop_way(my_array, my_indices):new_array = np.empty(my_indices.shape)对于 xrange(len(my_indices)) 中的 i:new_array[i, :] = my_array[i][:, my_indices[i]]返回新数组
但我正在寻找一种纯矢量化的解决方案.
当使用索引数组索引另一个数组时,每个索引数组的形状应该与输出数组的形状相匹配.您希望列索引匹配 inds
,并且您希望行索引匹配输出的行,例如:
array([[0, 0],[1, 1],[2, 2]])
你可以只使用上面的单列,由于广播,所以你可以使用 np.arange(3)[:,None]
是垂直的 arange
因为 None
插入一个新轴:
终于在一起了:
<预><代码>>>>a[np.arange(3)[:,None], inds]数组([[0, 3], # a[0,[0,1]][6, 0], # a[1,[1,2]][0, 9]]) # a[2,[0,2]]I am looking for a vectorized way to index a numpy.array
by numpy.array
of indices.
For example:
import numpy as np
a = np.array([[0,3,4],
[5,6,0],
[0,1,9]])
inds = np.array([[0,1],
[1,2],
[0,2]])
I want to build a new array, such that every row(i) in that array is a row(i) of array a
, indexed by row of array inds(i). My desired output is:
array([[ 0., 3.], # a[0][:,[0,1]]
[ 6., 0.], # a[1][:,[1,2]]
[ 0., 9.]]) # a[2][:,[0,2]]
I can achieve this with a loop:
def loop_way(my_array, my_indices):
new_array = np.empty(my_indices.shape)
for i in xrange(len(my_indices)):
new_array[i, :] = my_array[i][:, my_indices[i]]
return new_array
But I am looking for a pure vectorized solution.
When using arrays of indices to index another array, the shape of each index array should match the shape of the output array. You want the column indices to match inds
, and you want the row indices to match the row of the output, something like:
array([[0, 0],
[1, 1],
[2, 2]])
You can just use a single column of the above, due to broadcasting, so you can use np.arange(3)[:,None]
is the vertical arange
because None
inserts a new axis:
>>> np.arange(3)[:, None]
array([[0],
[1],
[2]])
Finally, together:
>>> a[np.arange(3)[:,None], inds]
array([[0, 3], # a[0,[0,1]]
[6, 0], # a[1,[1,2]]
[0, 9]]) # a[2,[0,2]]
这篇关于通过没有循环的二维索引数组索引二维 numpy 数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!