使用scipy interpolate griddata方法重新生成数据时出现意外的内存错误

时间:2014-08-06 22:55:13

标签: python numpy memory-leaks grid scipy

我有一个3000x6000 2D网格(来自tiff图像)。我想使用griddata库中的scipy.interpolate方法将其重新划分为较低分辨率的网格。首先,我需要根据我读到的here形成18000000x2 numpy array作为griddata的输入。这是我的所作所为:

import numpy as np
from scipy.interpolate import griddata
x_length = 6000
y_length = 3000
def func(x, y):
    return x*(1-x)*np.cos(4*np.pi*x) * np.sin(4*np.pi*y**2)**2
grid_x, grid_y = np.meshgrid(np.linspace(0,1,x_length),np.linspace(0,1,y_length))
points = np.random.rand(x_length*y_length, 2)
values = func(points[:,0], points[:,1])
grid_z0 = griddata(points, values, (grid_x, grid_y), method='nearest')

我在MemoryError做了griddata。我有8 GB的RAM,我不应该根据this question的第一个答案得到此错误。

总的来说,将3000x6000网格重新划分为较低分辨率的网格不应该那么难,我想我在做一些有趣的事情。我是否应该使用8 gb RAM获得e MemoryError这些代码留言?

P.S:虽然我有一个64-bit操作系统(Windows 7),但我使用以下Python版本:

Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32

1 个答案:

答案 0 :(得分:2)

正如评论所指出的那样,你内存不足。在64位Windows 7上运行的32位Python仅限于2 GB的内存,你只是闯进了它。

有三种解决方案:

  1. 获取64位Python。 (建议
  2. 插入几个块(将图像分割成一些合适的重叠部分)(费力
  3. 重新考虑插值方法(推荐
  4. 如果您有一个常规网格(如图像的情况),使用griddata将其重新划分为另一个常规网格在内存和时间方面是非常浪费的。

    有几种方法可以对图像进行下采样。至少PILcv2模块提供下采样功能。如果您想使用SciPy方法,请查看scipy.ndimage.zoom。它允许您将图像从一个规则网格重新采样到另一个网格。