Python 使用3d阵列的索引填充4d阵列

Python 使用3d阵列的索引填充4d阵列,python,python-3.x,numpy,indexing,Python,Python 3.x,Numpy,Indexing,我有两个3D数组,一个包含我正在使用的值,另一个包含索引。我想用这两个填充4D阵列 索引数组的每个条目都指向输入数组的一行。4 首先,我只是迭代I、j和k的值,并手动填充每一行。然而,由于这是一个机器学习项目,这种方法花费的时间太长 #x.shape=(82500,3) #ind.shape=(82500,9) M=np.空(82500,9,3) 对于范围(0,M.shape[0])内的i: 对于范围(0,M.形状[1])内的j: 对于范围(0,M.形状[2])中的k: M[i,j,k,:]=x

我有两个3D数组,一个包含我正在使用的值,另一个包含索引。我想用这两个填充4D阵列

索引数组的每个条目都指向输入数组的一行。4

首先,我只是迭代I、j和k的值,并手动填充每一行。然而,由于这是一个机器学习项目,这种方法花费的时间太长

#x.shape=(82500,3)
#ind.shape=(82500,9)
M=np.空(82500,9,3)
对于范围(0,M.shape[0])内的i:
对于范围(0,M.形状[1])内的j:
对于范围(0,M.形状[2])中的k:
M[i,j,k,:]=x[i,ind[i,j,k],:]

有没有更快的方法可以做到这一点?

您可以尝试以下方法:

import numpy as np
M = x[np.arange(0,ind.shape[0])[:, None, None], ind]
其中,需要
[:,None,None]
np.arange(0,ind.shape[0])
广播到正确的维度,以便对数组
x
进行索引

作为测试,您可以使用当前方法生成数组
M
,然后使用上述方法生成数组
M
,并确认
(M==M)。all()
返回
True


我的速度至少达到30倍。

谢谢您的帮助!它起作用了,你对提速的看法是对的。