在阅读numpy文档时,我遇到了函数numpy.histogram()
。
它是用来做什么的,它如何工作?文档中提到了bins:它们是什么?
通过一些谷歌搜索,我了解了直方图的定义。我理解这个概念了。但是不幸的是,我无法将这个知识与文档中给出的示例联系起来。
在阅读numpy文档时,我遇到了函数numpy.histogram()
。
它是用来做什么的,它如何工作?文档中提到了bins:它们是什么?
通过一些谷歌搜索,我了解了直方图的定义。我理解这个概念了。但是不幸的是,我无法将这个知识与文档中给出的示例联系起来。
“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])
。
由于这里的区间具有相等的宽度,所以可以将每个柱的高度用作其条形图的高度。绘制时,你会得到:
你可以直接使用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()
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()
plt.bar(bin_edges[:-1], hist, width=1)
和plt.xlim(min(bin_edges), max(bin_edges))
,这样能使条形图的宽度与预期相符(否则可能会出现没有值在中间的较小的柱形)。 - Bruno