【问题标题】:Seeking a more efficient python numpy ravel+reshape求更高效的python numpy ravel+reshape
【发布时间】:2014-04-21 05:49:16
【问题描述】:

我很好奇是否有更好的方法来进行 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 专业人士有任何建议。

谢谢!

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

首先,就地重塑最终比 .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 中的行为方式......这对我来说是重点......不需要解开。此外,转置是一个就地视图。

【问题讨论】:

  • 您可以更改数组的shape 参数,从而导致就地形状更改。例如。

标签: python memory numpy reshape


【解决方案1】:

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

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

转置它会给你一个视图(这样会有点到位),所以你可以这样做

res_T = res.T

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

【讨论】:

  • 我正在编写一个小基准脚本,我会添加它。
猜你喜欢
  • 2016-12-04
  • 2019-04-18
  • 2020-07-29
  • 2016-11-16
  • 2021-12-20
  • 2016-10-29
  • 2011-11-07
  • 2015-11-01
  • 1970-01-01
相关资源
最近更新 更多