有没有优雅/快速的方法来重现这个没有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], :]
答案 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
不同。