Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从一维阵列创建三维阵列的有效方法_Python_Arrays_Numpy - Fatal编程技术网

Python 从一维阵列创建三维阵列的有效方法

Python 从一维阵列创建三维阵列的有效方法,python,arrays,numpy,Python,Arrays,Numpy,我有一个2D数组,它的前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

我有一个2D数组,它的前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]
下面是一个示例输入2D数组(tempData):

下面是预期输出数组(temp):

我找到了一个更好(有效)的方法使用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)))

您是否有示例输入和预期输出?一般来说,不应该使用三级for循环,这会导致代码速度变慢,而应该使用矢量化代码-
np。unique
表示它返回排序后的值。它还可以返回
索引
反向索引
,这可以让您跳过
np.非零
。但是我还没有对您的代码进行足够的研究,以清楚地了解它应该做什么,特别是因为您没有提供一个小样本
tempData
数组(和结果);如果你看看类似问题的答案,你会发现我们用一个小的工作示例来“证明”它们。我也喜欢显示中间结果,这样OP就可以可视化正在发生的事情(它还可以帮助我开发和测试代码)。你的问题严重遗漏了任何有用的东西。@hpaulj:谢谢你指出。我编辑了这篇文章,加入了示例输入和输出数组
[[[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]]]
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)))