是否有任何binning函数返回“binned matrix”而不是每个点的bin索引?

2024-04-29 00:34:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个矩阵,包含了地球某一部分的NO2测量值,还有2个同样大小的矩阵,包含纬度和经度。在

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

我想将这些基于lat和lon的NO2值放入0.125度的容器中,如下所示:

^{pr2}$

现在,我知道了数字化以及数字直方图可以返回每个NO2值所属的存储单元的索引,但我需要实际的binned矩阵。该矩阵如下所示:

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

每个料仓的深度为15。如果我现在称之为binnedMatrix[0][0](它包含经度在-180、-179.875和纬度在-90、-89.875之间的所有点),那么我希望所有的NO2值在这些纬度和经度范围内。这样就可以把矩阵存储在某个地方,这正是我想要的。在

有没有函数可以返回这个矩阵?或者没有for循环,有什么方法可以做到这一点?在


Tags: 地球np矩阵数字random容器lonlat
2条回答

我很困惑你到底想要什么。不过,这是我对你所写内容的解释。在

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])

然后我可以抓到一个特定的小组

^{pr2}$

我也遇到过类似的问题,你的last comment似乎也有关系。在

假设三维空间中的点具有xyz,我想把所有值z分别放在它们的x和{}的一个bin中。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]。这将检索所有的NO2值,尽管每个bin可以得到15个以上的值。在

相关问题 更多 >