【问题标题】:Assigning histogram bin to each data point将直方图 bin 分配给每个数据点
【发布时间】:2015-10-11 05:43:30
【问题描述】:

我有一个数组days=[1,4,5,2,7,2,7,8,3,10]。我使用a,b=numpy.histogram(days,bins=5) 从这个数组创建了一个直方图。 a 和 b 的值是

a=[3,2,1,3,1]
b=[1., 2.8, 4.6, 6.4, 8.2, 10.]

我想要创建另一个与days 大小相同的数组标签,但它应该告诉我days 中的哪个 bin 数据属于。在这种情况下,输出应该是

label=[1,2,3,1,4,1,4,4,2,5]

这里的意思是总共有 5 个垃圾箱。 days[0]=1 属于 label[0]=1st bin days[1]=4 属于 label[1]=2nd bin 依此类推。我可以使用 for 循环并迭代天数的每个元素,将它们与 bin 间隔进行比较,但我有大数据集说天数将接近 4000 个点,并且会有 20 个 bin。因此,如果我遍历所有数据并对每个 bin 进行比较,将会有 20 个比较使代码混乱。有没有办法减少这种混乱并使整个过程自动化

【问题讨论】:

    标签: python arrays numpy histogram


    【解决方案1】:

    np.digitize可以生成标签:

    In [68]: a, b = np.histogram(days,bins=5)
    
    In [69]: np.digitize(days, bins=b)
    Out[69]: array([1, 2, 3, 1, 4, 1, 4, 4, 2, 6])
    

    请注意,您无需先致电np.histogram;那只是为了让np.digitize 使用与np.histogram 生成的相同的垃圾箱。您还可以使用以下方法生成垃圾箱:

    In [71]: np.linspace(1, 10, 6)
    Out[71]: array([  1. ,   2.8,   4.6,   6.4,   8.2,  10. ])
    

    或者,更一般地说,

    In [76]: np.linspace(min(days), max(days), 6)
    Out[76]: array([  1. ,   2.8,   4.6,   6.4,   8.2,  10. ])
    

    默认情况下,np.digitize 使用不包括右 bin 边缘的半开间隔。如果right=True 则包含右侧 bin 边缘,但不包含左侧:

    In [72]: np.digitize(days, bins=b, right=True)
    Out[72]: array([0, 2, 3, 1, 4, 1, 4, 4, 2, 5])
    

    要获得您发布的确切输出,您可以稍微扩展最右边的 bin 边缘:

    In [80]: np.digitize(days, bins=np.linspace(1, np.nextafter(10,np.inf), 6))
    Out[80]: array([1, 2, 3, 1, 4, 1, 4, 4, 2, 5])
    

    虽然bins=np.linspace(1, 11, 6) 也适用于本示例,但最好将 10 增加尽可能小的数量,以便尽可能少地更改其他 bin 边缘。 np.nextafter(10, np.inf) 在 10 之后返回 np.inf 方向上可表示为浮点数的下一个数字。

    In [82]: np.nextafter(10,np.inf)
    Out[82]: 10.000000000000002
    

    【讨论】:

      猜你喜欢
      • 2017-01-18
      • 2011-01-09
      • 1970-01-01
      • 1970-01-01
      • 2019-06-04
      • 2020-09-21
      • 2019-09-26
      • 1970-01-01
      • 2016-10-27
      相关资源
      最近更新 更多