假设A
是N
乘M
的矩阵,而idx
是N
乘P
的整数矩阵range(M)
。我想要一个N
的{{1}}乘P
子矩阵,将其命名为A
,使得每个B
都B[i, :] == A[i, idx[i, :]]
。实现此目的的正确切片方法是什么?
例如,假设
i in range(M)
我想找到
>> a = np.arange(24).reshape((4, 6)) # N = 4, M = 6
>> a
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
>> idx = np.array([[1, 2, 3, 4],\
[1, 2, 3, 4],\
[2, 3, 4, 5],\
[1, 2, 3, 4]])
这样
>> b = A[some_magic_slice]
我当时以为>> b =
array([[ 1, 2, 3, 4],
[ 7, 8, 9, 10],
[14, 15, 16, 17],
[19, 20, 21, 22]])
就可以了。但是事实并非如此。甚至a[idx]
都提供3D数组。到目前为止,我找到的解决方案是
a[:, idx]
但是我认为这太过分了。 (基本上,无缘无故需要创建并存储一个巨大的 >> idx2 = np.tile(np.arange(4).reshape((-1, 1)), (1, 4))
>> b = a[idx2, idx]
×N
矩阵!)
实现此目标的正确(有效)切片是什么?