将1D的numpy数组重塑为3D,顺序为x、y、z。

3

假设我有一个包含x、y和z值的一维数组,如下所示:

x  y  z  arr_1D
0  0  0  0
1  0  0  1
0  1  0  2
1  1  0  3
0  2  0  4
1  2  0  5
0  0  1  6
...
0  2  3  22
1  2  3  23

我希望将arr_1D转换为一个3D数组arr_3D, 形状为(nx,ny,nz) (在这个例子中为(2,3,4))。我希望可以通过arr_3D[x_index, y_index, z_index]访问值,例如:arr_3D[1,2,0]=5。使用numpy.reshape(arr_1D, (2,3,4))可以给我正确尺寸的3D矩阵,但不是我想要的顺序。虽然我知道可以使用以下代码,但我想知道是否有一种方法可以避免笨重的嵌套循环。
arr_1d = np.arange(24)
nx = 2
ny = 3
nz = 4
arr_3d = np.empty((nx,ny,nz))
count = 0
for k in range(nz):
    for j in range(ny):
        for i in range(nx):
            arr_3d[i,j,k] = arr_1d[count]
            count += 1

print arr_3d[1,2,0]

output: 5

最符合Python风格或者速度最快的方法是什么?我通常希望在长度为100,000左右的数组上执行此操作。

1个回答

8
你很接近了,但是由于你想让x轴成为最快迭代的轴,所以需要使用类似以下的内容:
arr_3d = arr_1d.reshape((4,3,2)).transpose()

所以您可以创建一个具有正确元素顺序但维度顺序错误的数组,然后纠正维度顺序。


非常好用,谢谢!我之前尝试了一些其他的转置方法,但都不起作用,不知道为什么没有尝试这个。 - Ben Lindsay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接