python - 求更高效的python numpy ravel+reshape

标签 python memory numpy reshape

我很好奇是否有更好的方法来进行 numpy ravel+reshape。
我加载了一大堆大图像并得到一个形状数组(num-rasters,h,w),其中 num-rasters 是图像的数量,h/w 是图像的高度/宽度(它们都是相同的尺寸)。 我希望将数组转换为形状 (h*w, num-rasters)

这是我现在的做法:

res = my_function(some_variable) #(num-rasters, h, w)

res = res.ravel(order='F').reshape((res.shape[1] * res.shape[2], res.shape[0])) #(h*w, num-rasters)

它工作正常,但我的“res”变量(图像堆栈)有几个 Gigs 大小,即使有大量 ram (32Gigs),操作也能完成所有工作。 我很好奇是否有任何 pythonistas 或 numpy 专业人士有任何建议。

谢谢!

############### 发布问题编辑/跟进

首先,就地 reshape 最终比 .reshap() 调用快得多……这可能会返回一个包含所有相关内存内容的副本。我早该知道这一点。

在我发布后不久,我发现了“swapaxes”http://docs.scipy.org/doc/numpy/reference/generated/numpy.swapaxes.html所以我也用它做了一个版本:

res2 = res.swapaxes(0, 2).reshape((res.shape[1] * res.shape[2], res.shape[0]))

用了 9.2 秒 它只比我原来的(9.3)快一点点。但是在我的过程中只有一个可辨别的内存峰值......但仍然是一个大而慢的峰值。

正如魔术所暗示的那样:

res.shape = (res.shape[0], res.shape[1]*res.shape[2])
res_T = res.T

基本上没有时间(2.4e-5 秒),没有内存峰值。 并扔出一份副本:

res.shape = (res.shape[0], res.shape[1]*res.shape[2])
res_T = res.T.copy()

使操作耗时 0.85 秒,并出现类似(但短暂)的内存峰值(对于副本)。

对我来说,“swapaxes”的作用与转置相同,但你可以交换任何你想要的轴,而转置有其固定的翻转方式。也很高兴看到转置在 3-d 中的表现……这对我来说是要点……不需要解释。此外,转置是一个就地 View 。

最佳答案

您可以更改数组的形状参数,从而导致就地形状更改。判断哪个维度去哪里有点棘手,但按照这些思路应该可以工作:

res.shape = (res.shape[0], res.shape[1]*res.shape[2]) ## converts to num_rasters, h*w

转换它会给你一个 View (这样就可以了),这样你就可以做

res_T = res.T

据我所知,这应该不会导致内存复制。

关于python - 求更高效的python numpy ravel+reshape,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22430382/

相关文章:

c - strcpy 产生重复的存储项

python - 丢失 numpy 数组的维度

python - 与 ndarray 的矩阵乘法

python - 如何使用geth在钱包之间转移代币

python - 如何获得今天与 Pandas 的约会?

memory - 汇编中的实验性操作系统 - 无法在屏幕上显示字符 (pmode)

python - 使用python的多项式回归

python - CMake错误: could NOT find Python (missing: Python_NumPy_INCLUDE_DIRS NumPy) (found version "2.7.17")

python - 如何在Python中正确传递参数

c - 在 Linux 中使用 ftok() 最多可以创建多少个共享内存 key ?