2017-02-22 58 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