我有一个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
答案 0 :(得分:2)
正如评论所指出的那样,你内存不足。在64位Windows 7上运行的32位Python仅限于2 GB的内存,你只是闯进了它。
有三种解决方案:
如果您有一个常规网格(如图像的情况),使用griddata
将其重新划分为另一个常规网格在内存和时间方面是非常浪费的。
有几种方法可以对图像进行下采样。至少PIL
和cv2
模块提供下采样功能。如果您想使用SciPy方法,请查看scipy.ndimage.zoom
。它允许您将图像从一个规则网格重新采样到另一个网格。