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

139 投票
3 回答
287049 浏览
提问于 2025-04-17 12:19

在阅读关于numpy的资料时,我遇到了一个函数 numpy.histogram()

这个函数是用来干什么的呢?它是怎么工作的? 在文档中提到bins:这又是什么东西呢?

我在网上查了一下,找到了关于直方图的一般定义 (Histograms)。我明白这个概念了。但是不幸的是,我无法把这些知识和文档中的例子联系起来。

3 个回答

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

这种方式可以很好地展示直方图,特别是当你想要更细致的数据显示,而不是到处都是柱状图时。这在处理图像直方图时特别有用,可以帮助你识别极端的像素值。

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()   

在这里输入图片描述

196

一个“箱子”是指直方图中每个条形在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()

enter image description here

撰写回答