如何在numpy中沿着2D数组的维度传递索引列表?

vnzz0bqm  于 2023-05-17  发布在  其他
关注(0)|答案(2)|浏览(90)

假设我有一个2D的numpy数组,比如4x3:

myarray = np.array([[0,1,2],
                    [3,4,5],
                    [6,7,8],
                    [9,10,11]])

我有一个对应于第二维的索引列表,长度为4,值的范围从0到2,即对于4行中的每一行,我有一个不同的索引,对应于我想从该行中选择的值:

idx = [0,2,1,2]

我如何将这个索引列表传递给2D数组,并得到以下长度为4的1D数组,其中每个元素对应于原始数组每行的索引值?

array([ 0,  5,  7, 11])

我正在寻找一个解决方案,不需要循环,因为我打算这样做非常大的数组。

au9on6nz

au9on6nz1#

你应该使用zip同时迭代两个数组。

data = [
    [1,2,3,4,5],
    [2,4,6,8,10],
    [3,6,9,12,15]
]

indexes = [0,1,2]

for (arr, i) in zip(data, indexes):
    print(arr[i])
    
# Or more pythonic way 😂    
print([arr[i] for (arr,i) in zip(data, indexes)]) # [1, 4, 9]
ztyzrc3y

ztyzrc3y2#

为了简单起见,我将尺寸减少到2x2,以使示例更容易显示。
假设我们有一个二维数组:

arr = np.array(
  [[1,2], 
   [3,4]]
)
nrows = arr.shape[0] # 1000 in your case

和一个一维索引数组:

idx = np.array([1,0])

在您的例子中,2D数组的dims为1000 x40,1D数组的索引dims为1000。
1.将索引转换为形状为1000 x1的2D数组

idx = np.array([0,1]).reshape(-1,1)

1.根据1D向量idx,使用以下命令选择每行中索引处的元素

arr[np.arange(arr.shape[0])[:,None], idx]

np.arange(arr.shape[0])[:,None]只是为2D数组中的所有行生成一个选择器。
您的输出将如下所示。

array([[2],
       [3]])

希望这是有帮助的!

相关问题