寻找一个更高效的python numpy ravel+;重塑

寻找一个更高效的python numpy ravel+;重塑,python,memory,numpy,reshape,Python,Memory,Numpy,Reshape,我很好奇是否有更好的方法来进行裸体拉威尔+重塑。 我加载了一大堆大图像,得到了一个形状数组(num rasters,h,w),其中num rasters是图像的数量,h/w是图像的高度/宽度(大小都相同)。 我希望将数组转换为形状(h*w,num光栅) 以下是我现在的做法: res = my_function(some_variable) #(num-rasters, h, w) res = res.ravel(order='F').reshape((res.shape[1] * res.sh

我很好奇是否有更好的方法来进行裸体拉威尔+重塑。
我加载了一大堆大图像,得到了一个形状数组(num rasters,h,w),其中num rasters是图像的数量,h/w是图像的高度/宽度(大小都相同)。 我希望将数组转换为形状(h*w,num光栅)

以下是我现在的做法:

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'变量(图像堆栈)的大小是几gig,即使有一吨ram(32gig),操作也需要全部。 我很好奇,如果有任何蟒蛇或numpy专业人士有任何建议

谢谢

###############问题后编辑/跟进 首先,就地重新整形的速度比.reforma()调用快得多……该调用可能会返回一个包含所有相关内存内容的副本。我早该知道的

在我发布后不久,我发现了“Swapax”,所以我也用它制作了一个版本:

res2 = res.swapaxes(0, 2).reshape((res.shape[1] * res.shape[2], res.shape[0]))
花了9.2秒 它只比我原来的(9.3)快了一点点。但在我的记忆过程中,只有一个明显的记忆峰值……但仍然是一个又大又慢的峰值

正如magic所建议的:

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秒


对我来说,最重要的是“交换”和转置做的事情是一样的,但是你可以交换任何你想要的轴,而转置有固定的翻转方式。也很高兴看到转置在3D中的表现……这是我的主要观点……不需要再赘述了。此外,转置是就地视图。

您可以更改阵列的形状参数,从而导致就地形状更改。要知道哪些维度去了哪里有点棘手,但沿着这些思路应该可以做到:

res.shape = (res.shape[0], res.shape[1]*res.shape[2]) ## converts to num_rasters, h*w
转置它会给你一个视图(所以会有点到位),这样你就可以做了

res_T = res.T

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

您可以更改数组的
形状
参数,从而导致就地形状更改。我正在编写一个小的基准脚本,我将把它添加到其中。