[英]Efficient way of creating a 3D array from 1D arrays
我有一个二维数组,其前 3 列代表 x、y、z 坐标,最后一列包含一些数据。 我正在尝试使用最后一列中的数据创建一个 3D 数组。 我为此编写的代码有 3 个 for 循环。 如果有人可以建议改进此代码或有替代更好的方法来达到相同的解决方案,将不胜感激。
tempData = np.loadtxt(cwd+'/T_t0-t20.txt', comments='%', usecols=(0,1,2,3))
x = np.sort(np.unique(tempData[:, 0]))
y = np.sort(np.unique(tempData[:, 1]))
z = np.sort(np.unique(tempData[:, 2]))
temp = np.zeros((len(x),len(y),len(z)))
for i in range(len(x)):
for j in range(len(y)):
for k in range(len(z)):
xind = np.where(tempData[:,0]==x[i])[0]
yind = np.where(tempData[:,1]==y[j])[0]
zind = np.where(tempData[:,2]==z[k])[0]
Tind = np.intersect1d(np.intersect1d(xind, yind), zind)[0]
temp[i,j,k] = tempData[:,3][Tind]
这是一个示例输入二维数组( tempData ):
[[ 0.0000e+00 -2.1429e-02 0.0000e+00 8.5963e+02]
[ 2.0202e-02 -2.1429e-02 0.0000e+00 8.1597e+02]
[ 4.0404e-02 -2.1429e-02 0.0000e+00 7.7315e+02]
[ 0.0000e+00 0.0000e+00 0.0000e+00 9.1180e+02]
[ 2.0202e-02 0.0000e+00 0.0000e+00 8.5293e+02]
[ 4.0404e-02 0.0000e+00 0.0000e+00 7.9282e+02]
[ 0.0000e+00 2.1429e-02 0.0000e+00 8.2700e+02]
[ 2.0202e-02 2.1429e-02 0.0000e+00 8.1224e+02]
[ 4.0404e-02 2.1429e-02 0.0000e+00 7.7315e+02]
[ 0.0000e+00 -2.1429e-02 -2.2222e-02 8.5946e+02]
[ 2.0202e-02 -2.1429e-02 -2.2222e-02 8.1589e+02]
[ 4.0404e-02 -2.1429e-02 -2.2222e-02 7.7315e+02]
[ 0.0000e+00 0.0000e+00 -2.2222e-02 9.1153e+02]
[ 2.0202e-02 0.0000e+00 -2.2222e-02 8.5278e+02]
[ 4.0404e-02 0.0000e+00 -2.2222e-02 7.9278e+02]
[ 0.0000e+00 2.1429e-02 -2.2222e-02 8.2689e+02]
[ 2.0202e-02 2.1429e-02 -2.2222e-02 8.1216e+02]
[ 4.0404e-02 2.1429e-02 -2.2222e-02 7.7315e+02]
[ 0.0000e+00 -2.1429e-02 -4.4444e-02 8.3552e+02]
[ 2.0202e-02 -2.1429e-02 -4.4444e-02 8.0395e+02]
[ 4.0404e-02 -2.1429e-02 -4.4444e-02 7.7315e+02]
[ 0.0000e+00 0.0000e+00 -4.4444e-02 8.7343e+02]
[ 2.0202e-02 0.0000e+00 -4.4444e-02 8.3067e+02]
[ 4.0404e-02 0.0000e+00 -4.4444e-02 7.8726e+02]
[ 0.0000e+00 2.1429e-02 -4.4444e-02 8.1191e+02]
[ 2.0202e-02 2.1429e-02 -4.4444e-02 8.0125e+02]
[ 4.0404e-02 2.1429e-02 -4.4444e-02 7.7315e+02]]
这是预期的 output数组( temp ):
[[[835.52 859.46 859.63]
[873.43 911.53 911.8 ]
[811.91 826.89 827. ]]
[[803.95 815.89 815.97]
[830.67 852.78 852.93]
[801.25 812.16 812.24]]
[[773.15 773.15 773.15]
[787.26 792.78 792.82]
[773.15 773.15 773.15]]]
我使用 Numpy 的 lexsort 找到了一种更好(有效)的方法。 这完全避免了for循环。 此处执行多列排序,首先沿“x”,然后沿“y”,然后沿“z”。 这是代码:
x = np.sort(np.unique(tempData[:, 0]))
y = np.sort(np.unique(tempData[:, 1]))
z = np.sort(np.unique(tempData[:, 2]))
tempData = tempData[np.lexsort(np.transpose(tempData)[::-1])]
temp = np.array(tempData[:, 3]).reshape((len(x),len(y),len(z)))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.