我有一个非常大的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]))
答案 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? - 您之前涉及此跨步代码的问题。