【问题标题】:Is there any binning function that returns the 'binned matrix' instead of the bin indices for each point?是否有任何分箱函数返回“分箱矩阵”而不是每个点的分箱索引?
【发布时间】:2017-02-22 08:01:01
【问题描述】:

我有一个矩阵,其中包含全球某个部分的 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 度的 bin 中,如下所示:

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

每个 bin 的深度为 15。如果我现在调用 binnedMatrix[0][0](它包含所有经度在 -180.,-179.875 和纬度之间的点 -90.,-89.875),我因此,希望所有在这些纬度和经度内分箱的 NO2 值。这样就可以将这个矩阵存储在某个地方,这正是我想要的。

有没有返回这个矩阵的函数?或者有什么方法可以在没有 for 循环的情况下完成?

【问题讨论】:

  • A代表什么? 1 bin 中的最大值?这会在第三维中留下一个参差不齐的数组,这可能不是一个 numpy 问题。
  • 好的,我很了解我的数据,1 个 bin 中最多可以有 15 个 NO2 值,所以 A=15。少于这 15 个的 bin 将只有零。

标签: python pandas numpy matrix


【解决方案1】:

我遇到了类似的问题,你的 last comment 似乎是相关的。

假设坐标轴为xyz 的三维空间中的点,我想将所有值z 分别放在与xy 位置对应的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 个。

【讨论】:

    【解决方案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])
    

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

    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
    

    【讨论】:

    • 好的,我知道我可以做到。然而,我想要的是,将那些 NO2 值分组在一个 1440x2880x15 的矩阵中(比如每个 bin 中最多有 15 个值),并且我得到以下结果:matrix[indexlat][indexlon] = [all 15此 bin 中的 NO2 值]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多