使用scipy interpolate griddata方法重网格数据时出现意外内存错误
我有一个 3000x6000
的二维网格(来自一个tiff图像)。我想用 scipy.interpolate
库里的 griddata
方法把它转成一个分辨率更低的网格。首先,我需要根据我在这里看到的,创建一个 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')
在执行 griddata
时,我遇到了 MemoryError
错误。我有8GB的内存,按照这个问题的第一个回答,我不应该出现这个错误。
总的来说,把一个 3000x6000
的网格转成分辨率更低的网格应该不难,我想我在这里做错了什么。我在执行这些代码时,8GB内存真的应该会出现 MemoryError
吗?
附注:虽然我使用的是 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 个回答
3
正如评论所提到的,你的程序内存不够用了。在64位的Windows 7上运行32位的Python,内存限制在2GB,而你刚好碰到了这个限制。
有三种解决办法:
- 换成64位的Python。(推荐)
- 把数据分成几块来处理(把图像切成一些合适的重叠部分)(比较麻烦)
- 重新考虑你的插值方法(建议)
如果你有一个规则的网格(比如图像),使用griddata
把它重新调整到另一个规则网格会浪费很多内存和时间。
有几种方法可以降低图像的分辨率。至少PIL
和cv2
模块都有降采样的功能。如果你想用SciPy的方法,可以看看scipy.ndimage.zoom
。这个方法可以让你把图像从一个规则网格重新采样到另一个规则网格。