转置数组并实际重新排序内存

23

我有一个3维的NumPy数组,例如:

a = np.random.random((2,3,5))

我想要交换最后两个轴,也就是

b = a.transpose(0,2,1)

然而,我不想要一种扭曲步幅的视图!我想要实际复制数组并在内存中重新排序。有什么最好的方法来实现这一点?

2个回答

26

copy() 方法默认会重新排列为 C 连续顺序:

b = a.transpose(0,2,1).copy()

注意: copy() 函数的默认行为不同。在使用该函数时,必须显式指定顺序以确保进行 C 连续的复制:

b = np.copy(a.transpose(0,2,1), order='C')

(请注意函数的文档字符串指出,ndarray方法是创建数组副本的首选方法。)


1
谢谢。在你发帖之前,我刚刚找到的解决方案是b = np.zeros((2,5,3)); b[:] = a.transpose(0,2,1),但你的更简洁。 - bdforbes

4
在背后,b的步幅与a不同。 建议使用ascontiguousarray,它将在需要时复制内存。而copy则总是会复制内存。

这是一个非常好的观点,特别是针对大数据集上的复杂代码!谢谢! - masaers

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