2016-11-07 4 views
0

4124 측정을 포함하는 nl 배열이 있다고 가정 해보십시오. 각각은 측정이 발생한 위치를 지정하는 (lat, lon) 부부와 연관됩니다. 이 위치는 그리드 화되지 않습니다. 즉, 일정한 간격의 값으로 정렬되지 않습니다.두 변수에 groupby_bins?

nl = xr.DataArray(nl, coords={'lon':(['time'], lon), 'lat':(['time'], lat)}, dims=['time']) 

가 나는 그룹 경도 나 위도의 쓰레기통에서 이러한 값이이 값에서 작동하도록 할 수 있습니다 알고 예를

를 들어, : 좌표로
In [51]: whos 
Variable Type   Data/Info 
--------------------------------- 
lat  ndarray  4124: 4124 elems, type `float32`, 16496 bytes 
lon  ndarray  4124: 4124 elems, type `float32`, 16496 bytes 
nl   ndarray  4124: 4124 elems, type `int16`, 8248 bytes 

나는 latlon를 지정 nl에 대한 DataArray를 만들
nl_avg_lon = nl.groupby_bins('lon', np.r_[-180:190:10]).mean() 
nl_avg_lat = nl.groupby_bins('lat', np.r_[-90:90:10]).mean() 

경도 x 위도의 2D 빈에 그룹 값을 그룹화하여 결과를 표시 할 수 있습니다. 지도로. groupby_bins이 그렇게 할 수 있다고 생각하지 않습니다. 또 다른 해결책이 있습니까? 예와

업데이트 :

latbins = np.r_[-90:100:10] 
lonbins = np.r_[-180:190:10] 
nsamples, xx, yy = np.histogram2d(lon, lat, bins=(lonbins, latbins)) 
nl_sum, xx, yy = np.histogram2d(lon, lat, bins=(lonbins, latbins), weights=nl) 
nl_avg = nl_sum/nsamples 

내가 대시 xarray의 통합을 유지하는 NumPy와에 의존하지 않도록하고 싶습니다 :

이 내가 NumPy와 적절한으로 원하는 것을 할 거라고 어떻게 .

답변

1

하나 이상의 차원으로 그룹화하는 작업이 현재 진행 중이지만 xarray에서는 아직 사용할 수 없습니다.

그 동안 아주 견딜 수있는 몇 가지 해결 방법이 있습니다.

In [12]: da=xr.DataArray(np.random.rand(3,3,2), dims=['lat','lon','time']) 

In [13]: da 
Out[13]: 
<xarray.DataArray (lat: 3, lon: 3, time: 2)> 
array([[[ 0.69092373, 0.94961267], 
     [ 0.74086633, 0.22628054], 
     [ 0.08215398, 0.16806347]], 

     [[ 0.67699002, 0.86242477], 
     [ 0.54688503, 0.57882117], 
     [ 0.21120849, 0.68743872]], 

     [[ 0.43816928, 0.57682212], 
     [ 0.10402045, 0.78923986], 
     [ 0.53284326, 0.23705761]]]) 
Coordinates: 
    * lat  (lat) int64 0 1 2 
    * lon  (lon) int64 0 1 2 
    * time  (time) int64 0 1 

In [14]: da.stack(latlon=['lat','lon']) 
Out[14]: 
<xarray.DataArray (time: 2, latlon: 9)> 
array([[ 0.69092373, 0.74086633, 0.08215398, 0.67699002, 0.54688503, 
     0.21120849, 0.43816928, 0.10402045, 0.53284326], 
     [ 0.94961267, 0.22628054, 0.16806347, 0.86242477, 0.57882117, 
     0.68743872, 0.57682212, 0.78923986, 0.23705761]]) 
Coordinates: 
    * time  (time) int64 0 1 
    * latlon (latlon) object (0, 0) (0, 1) (0, 2) (1, 0) (1, 1) (1, 2) ... 

In [15]: da.stack(latlon=['lat','lon']).groupby('latlon').mean() 
Out[15]: 
<xarray.DataArray (latlon: 9)> 
array([ 0.8202682 , 0.48357344, 0.12510872, 0.76970739, 0.5628531 , 
     0.44932361, 0.5074957 , 0.44663016, 0.38495044]) 
Coordinates: 
    * latlon (latlon) object (0, 0) (0, 1) (0, 2) (1, 0) (1, 1) (1, 2) ... 
+0

나는 잘 모르겠다. 새로운 차원에서'lat'와'lon'을 연결하도록 제안 하시겠습니까? 또는'nx' 차원을 따라? 두 경우 모두 새로 작성한 좌표의 치수가'nl' 변수의 치수와 호환되지 않는다고 생각합니다. 내가 오해하니? –

+0

'nl' 변수는 2 차원이 아니므로주의하십시오. 고유 한 특성 항목 (예 : 시간)이 있습니다. 해당 차원의 모든 nl 점은 위도와 경도와 연관됩니다. 위의'nl' 예제에서'lat'와'lon' 좌표는 병렬입니다. –

+0

예제를 추가했는데 더 합리적인가? – Maximilian

0

Here 당신이 ispire 수 있습니다 : 당신은 세 번째 좌표를 만드는 경우 예를 들어, 당신이에 의해 그룹 세트를 lat x lon 쓰레기통

여기에 간단한 예입니다을 생성하기 위해 조정할 수 있습니다, lat & lon의 CONCAT 이는 SABER 인공위성 데이터를 구역 별, 즉 위도와 수직 방향으로 비닝 할 때 약간 자신을.