【问题标题】:Histogram one array based on another array基于另一个数组的一个数组的直方图
【发布时间】:2020-01-04 19:37:01
【问题描述】:

我有两个 numpy 数组:

rates = [1.1, 0.8...]
zenith_anlges = [45, 20, ....]

rates 和 zen_angles 的长度相同。

我还有一些预定义的zenith_angle bins,

zen_bins = [0, 10, 20,...]

我需要做的是根据其对应的天顶角箱对rates进行分箱。

一个丑陋的方法是

nbin = len(zen_bins)-1 
norm_binned_zen = [[0]]*nbin 
for i in range(nbin):
    norm_binned_zen[i] = [0]
for i in range(len(rates)):
    ind = np.searchsorted(zen_bins,zen_angles[i]) #The corresponding bin number
    norm_binned_zen[ind-1].append(rates[i])

这不是很pythonic,对于大型数组来说很耗时。我相信一定有一些更优雅的方式来做到这一点?

【问题讨论】:

    标签: python numpy histogram


    【解决方案1】:

    起始数据(这里随机生成):

    import numpy as np
    
    rates = np.random.random(100)
    zenith_angles = np.random.random(100)*90.0
    zen_bins = np.linspace(0, 90, 10)
    

    由于您使用的是numpy,因此您可以使用单行解决方案:

    norm_binned_zen = [rates[np.where((zenith_angles > low) & (zenith_angles <= high))] for low, high in zip(zen_bins[:-1], zen_bins[1:])]
    

    将此行分为几个步骤:

    • 列表解析循环遍历每个 bin 的 low 和 hight 边缘。
    • numpy.where 用于在zenith_angles 数组中查找给定 bin 内的角度索引。
    • numpy indexing 用于在上一步获得的索引处选择rates 值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多