【发布时间】:2016-11-01 18:44:47
【问题描述】:
我尝试使用各种插值方法运行 scipy 1d-interpolation (interp1d)。数据是一个包含 525600 个数字的数组。当我使用“线性”、“最近”或“零”等更简单的方法运行它时,它运行良好,但是当我使用“三次”或“二次”时,它会导致“内存错误如下:
Traceback (most recent call last):
File "inter_comp.py", line 37, in <module>
interp = interp1d(indices[not_nan], B[not_nan], bounds_error=False,fill_value=0., kind = 'cubic')
File "/lustre/work/apps/anaconda/lib/python2.7/site- packages/scipy/interpolate/interpolate.py", line 476, in __init__
self._spline = splmake(self.x, self._y, order=order)
File "/lustre/work/apps/anaconda/lib/python2.7/site-packages/scipy/interpolate/interpolate.py", line 2356, in splmake
B = _fitpack._bsplmat(order, xk)
MemoryError
我的代码如下:
filn1 = "/lustre/work/hwon/PAPER2/Data/BAO_NEW/1year_New/BAO010_2013_WS_N.txt"
B = np.genfromtxt(filn1,delimiter="",usecols=0,dtype=None)
not_nan = np.logical_not(np.isnan(B))
indices = np.arange(len(B))
interp = interp1d(indices[not_nan], B[not_nan], bounds_error=False, fill_value=0., kind = 'cubic')
p1 = interp(indices)
我不确定是我使用的计算平台的问题,还是处理数据的方式或编码的问题。
您能告诉我解决这个问题的方法吗?
谢谢你, 艾萨克
【问题讨论】:
-
在没有经验的情况下,这对我来说似乎是正常的行为,因为如果它不是线性的,则会增加任务的复杂性。我会减少数据,比较线性与立方的内存使用情况;增加一点数据,再次比较。从中您可能会了解内部算法复杂性(或更重要的是:内存复杂性)。也许二次采样也是您最终插值的有效方法(如果您无法处理所有数据,只需使用一个子集)。遗憾的是,文档中似乎没有太多关于内部的信息:-/.
-
@sascha:感谢您的建议,我肯定会尝试比较三次/二次和线性的较短数据。
-
@sascha:但是,我需要使用整个数据,而不是减少一个。所以,我正在寻找使用三次和二次插值来使用整个数字数组的方法。
标签: python memory scipy interpolation