2016-06-29 2 views
1

다양한 보간 방법으로 scipy 1d 보간 (interp1d)을 실행하려고했습니다. 데이터는 525600 개의 숫자가있는 배열입니다. '선형', '가장 가까운'또는 '제로'와 같은 간단한 방법으로 실행했을 때 제대로 작동했지만 '입방 형'또는 '이차 형'을 사용하면 다음과 같은 '메모리 오류가 발생했습니다 :scipy 보간 (interp1d)을 실행할 때의 메모리 오류 문제

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) 

내가 사용하거나 또는 코딩의 데이터를 처리하는 방법의 컴퓨팅 플랫폼의 문제인지 모르겠습니다.

이 문제를 해결하려면 알려주십시오.

는 이삭 interp1d에서

+2

실험을하지 않고도 직선적이지 않은 작업의 복잡성 증가로 인해 정상적인 동작으로 보입니다. 데이터를 줄이고 선형 대 큐빅의 메모리 사용량을 비교합니다. 데이터를 약간 늘리고 다시 비교하십시오. 여기에서 내부 알고리즘 복잡성 (또는 더 중요한 것은 메모리 복잡성)에 대한 아이디어를 얻을 수 있습니다. 어쩌면 서브 샘플링은 최종 보간을위한 유효한 접근법입니다 (모든 데이터를 처리 할 수 ​​없으면 부분 집합 만 사용하십시오). 안타깝게도 문서의 내부에 대한 정보는 많지 않습니다. – sascha

+0

@ 사샤 : 제안에 감사드립니다. 확실히 입방/2 차 및 선형을 비교하여 더 짧은 데이터를 시도해 보겠습니다. – Isaac

+0

@sascha : 그러나이 전체 데이터를 사용해야하며 축소되지는 않습니다. 그래서, 나는 cubic 및 quadratic interpolation을 사용하여 숫자의 전체 배열을 사용하는 방법을 찾고 있습니다. – Isaac

답변

2

스플라인 보간 전체 행렬을 사용하여 주셔서 감사합니다. splev/splrep 콤보, UnivariateSpline 또는 CubicSpline을 더 잘 사용하십시오 (향후 scipy 버전에서 사용 가능).

EDIT :이 답변은 scipy 0.19.0 이상에서는 사용되지 않습니다. 여기서 interp1d은 더 이상 전체 행렬을 사용하지 않습니다.

관련 문제