如何重塑大数组(内存错误)

时间:2017-02-25 14:17:29

标签: python python-2.7 numpy

我有一个非常大的6D数组(225, 97, 225, 32, 32, 32)。我想将它重塑为4D数组,如(225*97*225, 32, 32, 32)。我尝试在ubuntu 14.04中使用python 2.7,但是我得到了内存错误。我该怎么解决?感谢

import numpy as np

#input_6D shape (225, 97, 225, 32, 32, 32)
input_4D= input_6D.reshape(input_6D.shape[0]*input_6D.shape[1]*input_6D.shape[2], input_6D[0],input_6D[1],input_6D[2])

错误是

  

input_4D = input_6D.reshape(input_6D.shape [0] * input_6D.shape [1] * input_6D.shape [2],input_6D [0],input_6D [1],input_6D [2])   的MemoryError

这是我所做的一步。首先,我加载形状为256x128x256的3D输入。然后我使用下面的代码将6D数组作为(225, 97, 225, 32, 32, 32),其中补丁形状为32, 32, 32

def patch_extract_3D(input,patch_shape):
    patches_6D = np.lib.stride_tricks.as_strided(input, ((input.shape[0] - patch_shape[0] + 1) // xstep, (input.shape[1] - patch_shape[1] + 1) // ystep,
                                                  (input.shape[2] - patch_shape[2] + 1) // zstep, patch_shape[0], patch_shape[1], patch_shape[2]),
                                                  (input.strides[0] * xstep, input.strides[1] * ystep,input.strides[2] * zstep, input.strides[0], input.strides[1],input.strides[2]))

1 个答案:

答案 0 :(得分:0)

跨步表达与xstep,ystep,zstep=1,1,1一起使用。

如果输入为np.zeros((256,128,256),np.int8)并且步幅为(32768, 256, 1),则输出将具有给定的形状并且步幅为(32768, 256, 1, 32768, 256, 1)

我计算出重塑数组的步幅必须为(1426325504, 58982400, 262144, 1024, 32, 1)

没有副本就没办法得到它。 as_strided生成原始视图。但重塑将使副本大约200倍。

有关在reshaping a view of a n-dimensional array without using reshape

as_strided创建副本的详情

此跨步视图可能适用于缩减操作,例如取最后3个维度的均值或求和。首先做,然后尝试重塑。 as_strided很棘手,而且在三维方面完成时也是如此。

How to recover 3D image from its patches in Python? - 您之前涉及此跨步代码的问题。