MemoryError试图将Numpy 2D数组转换为3D数组

时间:2015-05-25 15:02:41

标签: python arrays numpy multidimensional-array

将Numpy 2D阵列的一些数量(在本例中为153)转换为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的PC上使用32位Windows 7,因此3.5GB可用/我试过在另一台计算机上执行我的脚本(Win7 64位,16GB RAM)

感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:2)

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

但我怀疑,这里的真正问题是你在循环结束时没有任何关闭的情况下打开了适合文件(在你的情况下是hdu.close())。