python - numpy.transpose 是否在内存中重新排序数据?

标签 python arrays optimization numpy

为了加速 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/

相关文章:

c - 如何在 C 中打印数组元素的摘要

JavaScript - 通过数组中的ID查找对象并修改

javascript - 优化 Javascript 中首字母的搜索

c - 条件赋值的简写方式

python - 为什么此代码不能为 Project Euler Question #56 提供正确的结果?

python - Azure Python 函数应用程序中的 HTTP 请求

arrays - Delphi XE3 -> 整数到字节数组

java - 为什么建议在声明变量时使用尽可能窄的范围?

python - 在 TensorFlow 中多次初始化变量会导致内存泄漏

python - 对列表中的连续数字求和。 Python