질문이 있습니다. 나는이 SO 스레드를 this, this 및 that으로 사용하여 지금의 위치를 얻었습니다.업데이트 : 격자를 보간하기 위해 각 셀에 (벡터화 된) 함수를 적용하십시오.
나는 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
모두 그리 큰
같은 뭔가 내가 감사하지만 당신은 당신의 질문은 당신에게 매우 구체적이고 오히려 시간이 도움이 하나의 동기를 최소화 (답변을 소모 둘 다, 등등 배경과 참고 문헌 및 제시에 매우 신중했습니다). 임베디드 테스트 데이터를 사용하여 어려움에 대한 최소한의 예를 작성하도록 제안 할 수 있습니까? –
단순화 된 일반용 코드를 업데이트했습니다. – Mattijn
이제는 [최소한의 작업 예제] (http://minimalbeispiel.de/mini-en.html)로 만드십시오. 실행중인 모든 파일을 하나의 파일로 생성하고 문제를 보여 주며 게시하십시오. 관련성이없는 * 모든 것을 제거하십시오. 당신이 그것에있는 동안, [pep8] (http://www.python.org/dev/peps/pep-0008/)에 조금 더 밀착되도록 노력하십시오; 현재 당신의 코드는 구문 분석하기 어렵다. (가장 중요한 것은,'f '함수는 읽기가 어렵다. 여러 줄로 만들고 더 명확한 변수 이름을 사용한다.) –