【问题标题】:Memory error issue when running scipy interpolation (interp1d)运行 scipy 插值 (interp1d) 时出现内存错误问题
【发布时间】: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


【解决方案1】:

interp1d 中的样条插值使用完整矩阵。最好使用 splev/splrep 组合、UnivariateSpline 或 CubicSpline(将在未来的 scipy 版本中提供)。

编辑:从 scipy 0.19.0 及更高版本开始,此答案已过时,interp1d 不再使用完整矩阵。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    相关资源
    最近更新 更多