Python MemoryError正在尝试将Numpy 2D数组转换为3D数组

Python MemoryError正在尝试将Numpy 2D数组转换为3D数组,python,arrays,numpy,multidimensional-array,Python,Arrays,Numpy,Multidimensional Array,我在将一定数量(本例中为153)的Numpy 2D阵列转换为3D阵列时遇到一些问题(这些2D阵列表示灰度图像,即2048x2048x1,以便处理图像序列而不是一组2D图像)。我需要它来获得每个像素值随时间变化形成的信号(一旦这个问题得到解决,Numpy应该很方便) 我的代码(基本上)如下所示: zdim = len(imglist) # 'imglist' a Python list of the path for each image I need to process windowspan

我在将一定数量(本例中为153)的Numpy 2D阵列转换为3D阵列时遇到一些问题(这些2D阵列表示灰度图像,即2048x2048x1,以便处理图像序列而不是一组2D图像)。我需要它来获得每个像素值随时间变化形成的信号(一旦这个问题得到解决,Numpy应该很方便)

我的代码(基本上)如下所示:

zdim = len(imglist) # 'imglist' a Python list of the path for each image I need to process
windowspan = 512
xmin = ymin = 2
xmax = ymax = xmin + windowspan

sequence = []
for i in range(zdim):
    hdulist = fits.open(imglist[i],'readonly') # allow to open FITS image files
    hdr = hdulist[0].header['DATE-OBS'] # fetch the image date/time
    img = fc.readfitsimg(imglist[i]) # return a np ndarray (2D)
    patch = img[ymin:ymax, xmin:xmax] # take a small of the original image
    print("patchSize : " + str(patch.size*4))
    sequence.append(patch) # adding to the list
    print("it : " + str(i))
sequence = np.array(sequence) # transform to numpy array
解释器在大约85次迭代后返回MemoryError

有人会知道发生了什么吗?(详见下文)

其他一些细节: -我使用的是WinPython 32位(可移植),因为我无法安装“正确的”Python发行版(出于测试目的,我在Python 2.7.9.4和3.4.3.3之间切换) -我被迫在一台4GB的电脑上使用32位Windows 7,因此3.5GB可用/我曾尝试在另一台电脑上执行我的脚本(Win7 64位,16GB内存)

感谢您能为我提供的任何帮助。

当您的计算机内存不足时,会发生这种情况。在本例中,在将所有图像添加到多维数据集中时,当达到85x512x512的限制时,您似乎用完了。如果这是代码的唯一问题,我建议使用直接将结果保存到硬盘而不是RAM中。打开fits文件时,memmap选项也可用。
fits.open(…,memmap=True)
。在这种情况下,您只需打开光盘中的图像,并读取所需的部分,而不是将整个图像加载到RAM中


但我怀疑,这里真正的问题是,您一直在打开fits文件,而没有在循环结束时关闭(在您的例子中是hdu.close())

您应该给出整个
MemoryError
回溯,特别是在哪一行。嗨,小问题:包“bcolz”会解决这个问题吗?只是让您知道“memmap”技术因为数据类型而无法工作('ValueError:无法加载内存映射图像:存在BZERO/BSCALE/BLANK header关键字。设置memmap=False')问题是,在我的例子中,如果我想为每个像素随时间变化的灰度值向量,并同时使用Numpy数据结构,我需要将所有内容加载到RAM中(这就是我使用比原始图像小得多的补丁的原因)。我忘了提到“fits”是模块“Pyfits”的别名,其中没有称为“close”的方法……如果MemoryError弹出,分配的RAM应该是满的。您如何解释分配的RAM在两个不同的操作系统之间是相同的(32位对64位,3.5位对16GB的RAM)?你是说你在W7 64位16Go ram上也有同样的错误?嗨,悖论。Pyfits返回一个对象HDUlist,它确实有一个close方法:。我有理由相信你是在使用内存,因为在循环结束时没有关闭它们,如果你说图像比512x512的图像大得多的话,更是如此。试试看,你会不会真的在使用内存ch比图85更远。