三维矩阵的numpy索引操作

时间:2018-02-24 05:34:06

标签: python numpy

有没有优雅/快速的方法来重现这个没有for循环?我正在寻找一个价值的3D矩阵,以及2D矩阵,它给出了复制第三维的指数。创建相同形状的新3D矩阵时的值。这是一个包含很多循环的实现。

np.random.seed(0)

x = np.random.randint(5, size=(2, 3, 4))
y = np.random.randint(x.shape[1], size=(3, 4))

z = np.zeros((2, 3, 4))

for i in range(x.shape[0]):
    for j in range(x.shape[1]):
        z[i, j, :] = x[i, y[i, j], :]

1 个答案:

答案 0 :(得分:1)

这让我感到困惑,直到我意识到你没有使用y全部。 y是(3,4),但您正在索引(2,3):

In [28]: x[np.arange(2)[:,None], y[:2,:3],:]
Out[28]: 
array([[[4, 0, 0, 4],
        [4, 0, 3, 3],
        [3, 1, 3, 2]],

       [[3, 0, 3, 0],
        [2, 1, 0, 1],
        [1, 0, 1, 4]]])

我们可以将y全部用于:

In [32]: x[np.arange(2)[:,None,None],y,np.arange(4)]
Out[32]: 
array([[[4, 0, 3, 2],
        [4, 0, 3, 2],
        [3, 0, 0, 3]],

       [[3, 1, 1, 4],
        [3, 1, 1, 4],
        [1, 1, 3, 1]]])

3个索引广播到(2,3,4)。但选择与您的z不同。