2017-02-22 60 views
0

我有一個矩陣,其中包含地球某一部分的NO2測量結果,以及2個包含緯度和經度的相同大小的矩陣。是否有任何分箱函數返回「分箱矩陣」而不是每個點的分箱索引?

NO2 = np.random.rand(100,100) 
lat = np.random.rand(100,100)*90. 
lon = np.random.rand(100,100)*180 

我想斌基於緯度和經度爲0.125度箱,看起來像這樣的這些NO2值:

latBins = np.linspace(-90,90,180/.125+1) 
lonBins = np.linspace(-180,180,360/.125+1) 

現在,我知道numpy.digitize和numpy.histogram能給我返回每個NO2值所屬的bin的索引,但是我想要實際的binned矩陣。這個矩陣如下所示:

binnedMatrix = np.zeros((1440,2880,15)) 

與每個區間具有15的深度如果我現在所說binnedMatrix [0] [0](其保持所有點與-180之間經度, - 179.875和緯度。介於-90。, - 89.875之間),因此我希望得到這些貨幣和長期貨幣中的所有NO2價值。這樣就可以只存儲這個矩陣,這正是我想要的。

有沒有函數返回這個矩陣?或者有什麼辦法可以在沒有for循環的情況下完成?

+0

A代表什麼? 1 bin中的最大值?這會讓你在第三維中看到一個破舊的數組,並且可能不是一個粗糙的問題。 –

+0

好吧,我知道我的數據足夠好,最多15個NO2值可以在1個bin中,所以A = 15。小於15的垃圾桶只有零。 – Jesse

回答

0

我已經遇到了類似的問題,您last comment似乎是相關的。與軸xyz三維空間

假設點,我希望把所有值z在各自他們xy位置的垃圾桶。 This answer使用np.digitize,適用於一維陣列,但可以調整以適合三維。

In [1]: import numpy as np 

In [2]: data = np.random.randint(0, 100, 3000).reshape(-1, 3) 

In [3]: data 
Out[3]: 
array([[59, 94, 85], 
     [97, 47, 71], 
     [27, 10, 23], 
     ..., 
     [48, 61, 87], 
     [72, 22, 86], 
     [80, 47, 45]]) 

In [4]: bins = np.linspace(0, 100, 10) 

In [5]: bins 
Out[5]: 
array([ 0.  , 11.11111111, 22.22222222, 33.33333333, 
     44.44444444, 55.55555556, 66.66666667, 77.77777778, 
     88.88888889, 100.  ]) 

In [6]: digitized = np.digitize(data[:, 0:2], bins) 

In [7]: digitized 
Out[7]: 
array([[6, 9], 
     [9, 5], 
     [3, 1], 
     ..., 
     [5, 6], 
     [7, 2], 
     [8, 5]]) 

In [8]: data[np.equal(digitized, [6, 9]).all(axis=1)] 
Out[8]: 
array([[59, 94, 85], 
     [56, 94, 80], 
     [63, 97, 73], 
     [64, 94, 13], 
     [58, 92, 29], 
     [60, 97, 53], 
     [65, 92, 95], 
     [64, 91, 40], 
     [59, 92, 93], 
     [58, 94, 77], 
     [58, 89, 66], 
     [60, 89, 19], 
     [65, 95, 13], 
     [65, 89, 39]]) 

In [9]: data[np.equal(digitized, [6, 9]).all(axis=1)][:, 2] 
Out[9]: array([85, 80, 73, 13, 29, 53, 95, 40, 93, 77, 66, 19, 13, 39]) 

要解決您的問題,請使用data[np.equal(digitized, [index_latitide, index_longitude]).all(axis=1)[:, 2]。這將檢索所有的值,儘管每個垃圾箱可以獲得15個以上的值。

0

我對你想要的東西感到超級困惑。但是,這是我對你寫的內容的解釋。

n, m = NO2.shape 
df = pd.DataFrame(dict(
     NO2=NO2.ravel(), 
     lat=lat.ravel(), 
     lon=lon.ravel(), 
     i=np.arange(n).repeat(m), 
     j=np.tile(np.arange(m), n) 
    )) 

latBins = pd.cut(df.lat, np.linspace(-90, 90, 180/.125 + 1)) 
lonBins = pd.cut(df.lon, np.linspace(-180, 180, 360/.125 + 1)) 

g = df.groupby([latBins, lonBins]) 

然後我可以抓住特定羣體

g.get_group(('(0.875, 1]', '(83.75, 83.875]')) 

      NO2 i j  lat  lon 
6968 0.645213 69 68 0.956681 83.754923 
8495 0.383437 84 95 0.964288 83.863002 
+0

好的,我知道我可以做到這一點。然而,我想要的是,那些NO2值被分組在1440x2880x15的矩陣中(比如最多15個值將在每個bin中),並且我得到以下結果:矩陣[indexlat] [indexlon] = [所有15本箱中的NO2值] – Jesse