如何对三维Numpy数组中的每个子数组执行转置操作?
解决Numpy数组中子数组批量转置的问题
嘿,我来帮你搞定这个子数组转置的需求!首先咱们先明确一下你的数组结构:原数组A的形状是(2,2,3),你想要把每个外层的(2,3)子数组转置成(3,2),最终得到形状为(2,3,2)的数组对吧?
你之前尝试用np.apply_along_axis没成功,其实是因为这个函数的设计场景和你的需求不匹配——它是沿着指定轴对一维切片应用函数,而不是直接对多维子数组操作,而且底层是循环实现,处理大型数组效率也不高。
推荐的高效解决方案
对于这种轴的重排需求,Numpy内置的transpose或swapaxes才是最优选择,它们都是矢量化操作,处理大型数组速度极快:
方法1:使用transpose指定轴顺序
我们只需要调整轴的顺序,把原来的轴(0,1,2)改成(0,2,1),也就是保持最外层的轴(第0轴)不变,交换第1和第2轴:
import numpy as np A = np.arange(1,13).reshape(2,2,3) # 转置每个子数组 A_transpose = A.transpose(0, 2, 1)
方法2:使用swapaxes交换指定轴
如果只需要交换两个轴,swapaxes更简洁,直接指定要交换的两个轴索引(1和2):
A_transpose = A.swapaxes(1, 2)
验证结果
运行上面的代码后,打印A_transpose就能得到你想要的结果:
print(A_transpose) # 输出: # [[[ 1 4] # [ 2 5] # [ 3 6]] # # [[ 7 10] # [ 8 11] # [ 9 12]]]
为什么这两个方法更适合大型数组?
这两个操作都是Numpy底层用C实现的矢量化操作,完全避免了Python层面的循环,处理GB级别的大型数组时,效率比apply_along_axis高几个数量级,绝对是处理这类需求的首选。
内容的提问来源于stack exchange,提问作者MrClean
相关产品推荐
相关产品推荐

