如何将形状(nx, ny, nz)的3D数组重排为(nz, nx, ny)?求无循环Pythonic实现
问题
给定3D NumPy数组A:
import numpy as np A = np.array([[[1,1,1], [2,2,2]], [[3,3,3],[4,4,4]]])
需要生成一个新的3D数组B,其中每个元素是A在axis=2方向上的切片,预期结果如下:
B = [[[1,2],[3,4]],[[1,2],[3,4]], [[1,2],[3,4]]]
目前已通过循环实现需求,但直接使用A.reshape(3,2,2)无法得到预期结果,希望找到无循环的Pythonic实现方式。
解决方案
可以利用NumPy的轴变换工具实现向量化操作,无需循环,以下是两种高效方法:
方法1:np.moveaxis
直接将原数组的第2轴(axis=2)移动到第0轴的位置,其余轴保持原有顺序:
import numpy as np A = np.array([[[1,1,1], [2,2,2]], [[3,3,3],[4,4,4]]]) B = np.moveaxis(A, 2, 0) print(B)
输出:
[[[1 2] [3 4]] [[1 2] [3 4]] [[1 2] [3 4]]]
方法2:A.transpose()
通过指定轴的新顺序重新排列数组,原数组轴顺序为(0,1,2),我们需要将其调整为(2,0,1):
import numpy as np A = np.array([[[1,1,1], [2,2,2]], [[3,3,3],[4,4,4]]]) B = A.transpose(2, 0, 1) print(B)
输出结果与方法1完全一致。
这两种方法都是NumPy原生的向量化操作,比循环更高效,代码也更简洁符合Pythonic风格,同时省去了手动初始化数组和循环赋值的步骤。
内容的提问来源于stack exchange,提问作者minmax
相关产品推荐
相关产品推荐

