为了加速 np.std、np.sum 等函数沿 n 维巨大 numpy 数组的轴,建议沿最后一个轴应用。
当我这样做时,np.transpose 将我要操作的轴旋转到最后一个轴。它真的是在重新排列内存中的数据,还是只是改变轴的寻址方式?
当我尝试使用 %timeit 测量时间时。它在微秒内完成了这个转置,(比复制我拥有的 (112x1024x1024) 数组所需的时间小得多。
如果它实际上不是对内存中的数据重新排序而只是更改寻址,那么当应用于新旋转的最后一个轴时,它是否仍会加速 np.sum 或 np.std?
当我尝试测量它时,我似乎确实加快了速度。但我不明白。
更新
转置似乎并没有真正加快速度。最快的轴在按 C 顺序排列时是最后一个,在按 Fortran 顺序排列时是第一个。所以在应用 np.sum 或 np.std 之前转置是没有意义的。 对于我的特定代码,我通过在数组创建期间给出 order='FORTRAN' 解决了这个问题。这使得第一个轴最快。
谢谢大家的回答。
最佳答案
Transpose 只是改变了 strides ,它不会触及实际的数组。我认为为什么建议沿最终轴 sum
等的原因(我想看看它的来源,顺便说一句。)是当数组按 C 排序时,沿着最终轴走axis 保留引用位置。转置后情况就不同了,因为转置后的数组将按 Fortran 顺序排列。
关于python - numpy.transpose 是否在内存中重新排序数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19479384/