将直方图 bin 分配给每个数据点
Assigning histogram bin to each data point
我有一个数组 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个bin。 days[0]=1 属于 label[0]=1st bin days[1]=4 属于 label[1]=2nd bin 等等。我可以使用 for 循环并迭代天数的每个元素,将它们与 bin 间隔进行比较,但我有大量数据集说天数将接近 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
生成的相同的容器。您还可以使用以下命令生成垃圾箱:
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)
returns np.inf
.
方向上 10 之后的下一个可表示为浮点数的数字
In [82]: np.nextafter(10,np.inf)
Out[82]: 10.000000000000002
我有一个数组 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个bin。 days[0]=1 属于 label[0]=1st bin days[1]=4 属于 label[1]=2nd bin 等等。我可以使用 for 循环并迭代天数的每个元素,将它们与 bin 间隔进行比较,但我有大量数据集说天数将接近 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
生成的相同的容器。您还可以使用以下命令生成垃圾箱:
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)
returns np.inf
.
In [82]: np.nextafter(10,np.inf)
Out[82]: 10.000000000000002