2013-09-04 2 views
3

질문이 있습니다. 나는이 SO 스레드를 this, thisthat으로 사용하여 지금의 위치를 ​​얻었습니다.업데이트 : 격자를 보간하기 위해 각 셀에 (벡터화 된) 함수를 적용하십시오.

나는 weather-stations에서 DEM 파일과 좌표 + 데이터를 얻었습니다. 이제 DEM을 사용하여 GIDS 모델 (Model 12 in this article)에 따라 기온 데이터를 보간하고 싶습니다. 방송국을 선택하려면 KDTree를 사용하여 가장 가까운 이웃 8 명을 사용하고 싶습니다.

요약하면 (필자 생각) DEM의 좌표와 고도를 사용하여 모든 셀에서 함수를 평가하고 싶습니다.

x, y를 입력으로 사용하여 그리드의 각 값을 계산하는 작업 함수를 개발했습니다. 자세한 내용은 내 IPython Notebook을 참조하십시오.

하지만 지금은 전체 배열에 대해. 어떻게 든 더블 루프를 사용하는 대신 Numpy 배열에 적용 할 수 있도록 함수를 벡터화해야한다는 것을 이해합니다. numpy meshgrid를 사용하여 벡터화 된 함수로 for-loop 및 trial을 사용하여 배열에서 함수를 평가하는 간단한 코드를 참조하십시오. 이것이 앞으로의 길입니까? 편집

>>> data = [[0.8,0.7,5,25],[2.1,0.71,6,35],[0.75,2.2,8,20],[2.2,2.1,4,18]] 
>>> columns = ['Long', 'Lat', 'H', 'T'] 
>>> df = pd.DataFrame(data, columns=columns) 
>>> tree = KDTree(zip(df.ix[:,0],df.ix[:,1]), leafsize=10) 
>>> dem = np.array([[5,7,6],[7,9,7],[8,7,4]]) 
>>> print 'Ground points\n', df 
Ground points 
    Long Lat H T 
0 0.80 0.70 5 25 
1 2.10 0.71 6 35 
2 0.75 2.20 8 20 
3 2.20 2.10 4 18 
>>> print 'Grid to evaluate\n', dem 
Grid to evaluate 
[[5 7 6] 
[7 9 7] 
[8 7 4]] 
>>> def f(x,y): 
...  [see IPython Notebook for details] 
...  return m(sum((p((d(1,di[:,0])),2)))**-1 , 
...   sum(m(tp+(m(b1,(s(pix.ix[0,0],longp))) + m(b2,(s(pix.ix[0,1],latp))) + m(b3,(s(pix.ix[0,2],hp)))), (p((d(1,di[:,0])),2))))) 
... 
>>> #Double for-loop 
... 
>>> tp = np.zeros([dem.shape[0],dem.shape[1]]) 
>>> for x in range(dem.shape[0]): 
...  for y in range(dem.shape[1]): 
...   tp[x][y] = f(x,y) 
... 
>>> print 'T predicted\n', tp 
T predicted 
[[ 24.0015287 18.54595636 19.60427132] 
[ 28.90354881 20.72871172 17.35098489] 
[ 54.69499782 43.79200925 15.33702417]] 
>>> # Evaluation of vectorized function using meshgrid 
... 
>>> x = np.arange(0,3,1) 
>>> y = np.arange(0,3,1) 
>>> xx, yy = np.meshgrid(x,y, sparse=True) 
>>> f_vec = np.vectorize(f) # vectorization of function f 
>>> tp_vec = f_vec(xx,yy).T 
>>> print 'meshgrid\nx\n', xx,'\ny\n',yy 
meshgrid 
x 
[[0 1 2]] 
y 
[[0] 
[1] 
[2]] 
>>> print 'T predicted using vectorized function\n', tp_vec 
T predicted using vectorized function 
[[ 24.0015287 18.54595636 19.60427132] 
[ 28.90354881 20.72871172 17.35098489] 
[ 54.69499782 43.79200925 15.33702417]] 

나는 다음과 같이했다 100,100의 크기와 결과 그리드와 실제 데이터를 확인하기 위해 %%timeit을 사용 ..

#double loop 
for x in range(100): 
    for y in range(100):   
     tp[x][y] = f(x,y) 
1 loops, best of 3: 29.6 s per loop 

#vectorized 
tp_vec = f_vec(xx,yy).T 
1 loops, best of 3: 29.5 s per loop 

모두 그리 큰

+1

같은 뭔가 내가 감사하지만 당신은 당신의 질문은 당신에게 매우 구체적이고 오히려 시간이 도움이 하나의 동기를 최소화 (답변을 소모 둘 다, 등등 배경과 참고 문헌 및 제시에 매우 신중했습니다). 임베디드 테스트 데이터를 사용하여 어려움에 대한 최소한의 예를 작성하도록 제안 할 수 있습니까? –

+0

단순화 된 일반용 코드를 업데이트했습니다. – Mattijn

+0

이제는 [최소한의 작업 예제] (http://minimalbeispiel.de/mini-en.html)로 만드십시오. 실행중인 모든 파일을 하나의 파일로 생성하고 문제를 보여 주며 게시하십시오. 관련성이없는 * 모든 것을 제거하십시오. 당신이 그것에있는 동안, [pep8] (http://www.python.org/dev/peps/pep-0008/)에 조금 더 밀착되도록 노력하십시오; 현재 당신의 코드는 구문 분석하기 어렵다. (가장 중요한 것은,'f '함수는 읽기가 어렵다. 여러 줄로 만들고 더 명확한 변수 이름을 사용한다.) –

답변

3

격자에 벡터화 된 함수를 사용하는 경우 종속 배열의 모양으로 meshgrid를 작성해보십시오. 벡터화 된 함수를 사용하여 각 격자 셀을 평가하려면 meshgrid에서 파생 된 구성 요소를 사용합니다. 이

def f(x,y): 
    '...some code...' 
    single_value = array[x,y] # = dependent array (e.g. DEM) 
    '...some code...' 
    return z 

x = np.arange(array.shape[0]) 
y = np.arange(array.shape[1]) 
xx, yy = np.meshgrid(x,y, sparse=True) 

f_vec = np.vectorize(f) # vectorization of function f 

tp_vec = f_vec(xx,yy).T 
관련 문제