numpy.histogram()是如何工作的?
在阅读关于numpy的资料时,我遇到了一个函数 numpy.histogram()
。
这个函数是用来干什么的呢?它是怎么工作的? 在文档中提到bins:这又是什么东西呢?
我在网上查了一下,找到了关于直方图的一般定义 (Histograms)。我明白这个概念了。但是不幸的是,我无法把这些知识和文档中的例子联系起来。
3 个回答
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()
一个“箱子”是指直方图中每个条形在X轴上的宽度范围。你也可以把它叫做区间。(维基百科更正式地定义它们为“互不重叠的类别”。)
Numpy的histogram
函数并不会画出直方图,而是计算输入数据在每个箱子内出现的次数,这样就能确定每个条形的面积(如果箱子的宽度不一样,面积不一定和高度相同)。
在这个例子中:
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]
)来定义这些箱子,虽然它也会在结果中返回箱子,因为如果没有指定,Numpy可以自动从输入中选择箱子。如果你设置bins=5
,它会在最小输入值和最大输入值之间使用5个宽度相等的箱子。
输入值是1、2和1。因此,箱子“1到2”包含两个出现次数(两个1
),而箱子“2到3”包含一个出现次数(2
)。这些结果在返回的元组的第一个项目中:array([0, 2, 1])
。
由于这里的箱子宽度相等,你可以用出现次数来表示每个条形的高度。当画出来时,你会看到:
- X轴上范围/箱子[0,1]的条形高度为0,
- 范围/箱子[1,2]的条形高度为2,
- 范围/箱子[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()