gpt4 book ai didi

python - 将直方图箱分配给每个数据点

转载 作者:行者123 更新时间:2023-12-01 04:37:00 24 4
gpt4 key购买 nike

我有一个数组days=[1,4,5,2,7,2,7,8,3,10]。我使用从此数组创建了一个直方图a,b=numpy.histogram(天,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个bin。 days[0]=1 属于 label[0]=1st bin days[1]=4 属于 label[1]=2nd bin 等等。我可以使用 for 循环并迭代 days 的每个元素,将它们与 bin 间隔进行比较,但我有大量数据集,表示 days 将有接近 4000 个点,并且将有 20 个 bin。因此,如果我迭代所有数据并对每个 bin 进行比较,则会有 20 次比较,从而使代码变得困惑。有没有办法减少这种困惑并使整个过程自动化

最佳答案

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 生成的相同的 bin。您还可以使用以下命令生成垃圾箱:

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 方向表示为 float 的下一个数字。

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

关于python - 将直方图箱分配给每个数据点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31544667/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com