numpy.histogram()是如何工作的?

139

在阅读numpy文档时,我遇到了函数numpy.histogram()

它是用来做什么的,它如何工作?文档中提到了bins:它们是什么?

通过一些谷歌搜索,我了解了直方图的定义。我理解这个概念了。但是不幸的是,我无法将这个知识与文档中给出的示例联系起来。

3个回答

196

“Bin”是代表直方图中单个条的宽度范围,通常也可以称为区间。 (维基百科更正式地将它们定义为“不相交的类别”)。

Numpy的histogram函数并不会绘制直方图,但它会计算落在每个bin中的输入数据的出现次数,进而确定每个条形的面积(如果bin的宽度不相等,则不一定是高度)。

在这个例子中:

 np.histogram([1, 2, 1], bins=[0, 1, 2, 3])
有3个区间,值范围从0到1(不包括1),从1到2(不包括2)和从2到3(包括3)。在这个例子中,Numpy定义这些区间的方式是通过给定一个分隔符列表([0, 1, 2, 3]),尽管它也会在结果中返回这些区间,因为如果没有指定区间,则可以从输入自动选择它们。例如,如果bins=5,则会使用等跨度的5个区间,这些区间的范围均匀地分布在最小输入值和最大输入值之间。

输入值为1、2和1。因此,区间“1到2”包含两个出现次数(两个1值),而区间“2到3”包含一个出现次数(2)。这些结果在返回的元组的第一项中:array([0, 2, 1])

由于这里的区间具有相等的宽度,所以可以将每个柱的高度用作其条形图的高度。绘制时,你会得到:

  • X轴上范围/区间[0,1]的高度为0的柱形图,
  • X轴上范围/区间[1,2]的高度为2的柱形图,
  • X轴上范围/区间[2,3]的高度为1的柱形图。

你可以直接使用Matplotlib来绘制此图(它的hist函数也会返回区间和值):

>>> import matplotlib.pyplot as plt
>>> plt.hist([1, 2, 1], bins=[0, 1, 2, 3])
(array([0, 2, 1]), array([0, 1, 2, 3]), <a list of 3 Patch objects>)
>>> plt.show()

输入图像描述


9
如果您想绘制它们,也可以参考此答案Matplotlib也可以直接计算它们,在这里可以看到示例1和示例2 - Bruno
在鸢尾花数据集中, counts,bin_edges = np.histogram(iris_setosa ['petal_length'],bins = 10,density = True) 给出了浮点值的计数,根据您提供的示例,计数如何成为浮点值? - Dipen Gajjar
最佳答案应考虑忽略大于最大右侧的显著数量值。始终将超出最大边缘的值添加到最后一个bin中,或者手动更改最后创建的“bins”值为数组中的最大值。 - A.Ametov
如果省略 "density = True",则看不到它。密度关键字为您提供了一个“标准化”的直方图,其中表示概率密度函数。您可以在此处阅读有关它的更多信息:https://numpy.org/doc/stable/reference/generated/numpy.histogram.html。 - BUFU

82
import numpy as np    
hist, bin_edges = np.histogram([1, 1, 2, 2, 2, 2, 3], bins = range(5))

下面,hist 表示在第 0 个箱子中有 0 个项目,在第 1 个箱子中有 2 个项目,在第 3 个箱子中有 4 个项目,在第 4 个箱子中有 1 个项目。

print(hist)
# array([0, 2, 4, 1])   

bin_edges 表示第0个区间为[0,1),第1个区间为[1,2),依此类推,第3个区间为[3,4)。

print (bin_edges)
# array([0, 1, 2, 3, 4]))  

尝试使用上面的代码,将输入更改为np.histogram并观察其运行方式。


但图片胜过千言万语:

import matplotlib.pyplot as plt
plt.bar(bin_edges[:-1], hist, width = 1)
plt.xlim(min(bin_edges), max(bin_edges))
plt.show()   

图片描述


4
我认为以下内容会更准确:plt.bar(bin_edges[:-1], hist, width=1)plt.xlim(min(bin_edges), max(bin_edges)),这样能使条形图的宽度与预期相符(否则可能会出现没有值在中间的较小的柱形)。 - Bruno
1
在“plt.hist(...)”函数中是否可以使用上述numpy格式中获得的“hist”?因为在bar方法中,您将其作为“y”提供,而在这里的hist中只有x。 - kbg

10

使用numpy.histogram的另一个有用方法是将输出作为x和y坐标绘制在线图上。例如:

arr = np.random.randint(1, 51, 500)
y, x = np.histogram(arr, bins=np.arange(51))
fig, ax = plt.subplots()
ax.plot(x[:-1], y)
fig.show()

enter image description here

这是一种有用的可视化直方图的方式,可以在不随处添加条形的情况下获得更高的细粒度。在图像直方图中识别极端像素值非常有用。


这非常有用,可以查看图像的行和列投影。 - SKR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接