我很好奇是否有更好的方法来做一个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秒,并且内存峰值相似(但很短)(对于副本)。
对我来说,带回家就是“交换”'与转置做同样的事情,但你可以交换你想要的任何轴,而转置有固定的翻转方式。它也很高兴看到转置在3-d中表现如何......这对我来说是主要的......不需要拉扯。此外,转置是一种就地观点。答案 0 :(得分:4)
您可以更改数组的形状参数,从而导致原位形状更改。告诉哪些尺寸去哪里都有点棘手,但沿着这些方面的东西应该有效:
res.shape = (res.shape[0], res.shape[1]*res.shape[2]) ## converts to num_rasters, h*w
转置它会给你一个视图(所以会有一些到位),所以你可以做到
res_T = res.T
据我所知,这应该导致没有记忆复制。