gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 15:14:34 26 4
gpt4 key购买 nike

我很好奇是否有更好的方法来进行 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com