Numpy索引具有索引数组的数组的最后一个维度

2024-06-30 12:34:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用一个由我希望保留的索引组成的矩阵来索引3D矩阵的最后一个维度

我有一个带形状的推力值矩阵:

(3, 3, 5)

我想根据一些标准过滤最后一个索引,以便它从大小5减少到大小1。我已经在最后一个维度中找到了符合我标准的索引:

[[0 0 1]
 [0 0 1]
 [1 4 4]]

我想要实现的是:对于第一行和第一列,我想要最后一个维度的第0个索引。对于第一行和第三列,我需要最后一个维度的第一个索引。就保留最终矩阵的索引而言,最终矩阵将变成(3, 3)2D矩阵,如下所示:

[[0,0,0], [0,1,0], [0,2,1];
 [1,0,0], [1,1,0], [1,2,1];
 [2,0,1], [2,1,4], [2,2,4]]

我很有信心numpy能做到这一点,但我不知道具体是如何做到的。我不希望构建一个嵌套for循环的构造

我已经试过:

minValidPower = totalPower[:, :, tuple(indexMatrix)]

但是这会产生一个(3, 3, 3, 3)矩阵,所以我不完全确定应该如何处理这个问题


Tags: numpyfor标准矩阵形状tuple信心试图用
2条回答

可以为前两个维度构建相应的索引数组。这些基本上是:

[0 1 2]
[0 1 2]
[0 1 2]

[0 0 0] 
[1 1 1] 
[2 2 2]

可以使用meshgrid函数构造这些。在示例中,我将它们存储为m1和m2:

vals = np.arange(3*3*5).reshape(3, 3, 5) # test sample
m1, m2 = np.meshgrid(range(3), range(3), indexing='ij')
m3 = np.array([[0, 0, 1], 0, 0, 1], [1, 4, 4]])
sel_vals = vals[m1, m2, m3]

结果的形状与索引数组m1、m2和m3的形状匹配

a作为输入数组,以idx作为索引数组-

np.take_along_axis(a,idx[...,None],axis=-1)[...,0]

或者,使用开放网格-

I,J = np.ogrid[:idx.shape[0],:idx.shape[1]]
out = a[I,J,idx]

相关问题 更多 >