关于python:numpy.histogram()如何工作?

How does numpy.histogram() work?

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

它是做什么用的,它是如何工作的? 在文档中,他们提到了垃圾箱:它们是什么?

一些谷歌搜索使我大致了解直方图的定义。 我明白了。 但不幸的是,我无法将这些知识与文档中给出的示例联系起来。


bin是一个范围,代表直方图的单个条形沿X轴的宽度。您也可以将其称为间隔。 (维基百科更正式地将它们定义为"不相交的类别"。)

Numpy histogram函数不会绘制直方图,但会计算落入每个容器中的输入数据的出现次数,这反过来确定每个容器的面积(如果容器的宽度不相等,则不一定是高度)酒吧。

在此示例中:

1
 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])来定义这些bin,尽管它还会返回结果中的bin,因为如果未指定,则可以从输入中自动选择它们。例如,如果bins=5,它将在最小输入值和最大输入值之间使用等宽分布的5个bin。

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

由于此处的垃圾箱宽度相等,因此您可以使用出现次数来表示每个条形的高度。绘制时,您将具有:

  • X轴上范围/ bin [0,1]的高度为0的条,
  • 范围/箱[1,2]的高度为2的条,
  • 范围/箱[2,3]的高度为1的条。

您可以直接使用Matplotlib绘制此图(其hist函数还返回垃圾箱和值):

1
2
3
4
>>> import matplotlib.pyplot as plt
>>> plt.hist([1, 2, 1], bins=[0, 1, 2, 3])
(array([0, 2, 1]), array([0, 1, 2, 3]), )
>>> plt.show()

enter image description here


1
2
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个物料。

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

bin_edges表示bin#0是间隔[0,1),bin#1是[1,2),...,
bin#3是[3,4)。

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

播放上面的代码,将输入更改为np.histogram,然后查看其工作原理。

但是一张图片值得一千个字:

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

enter image description here


numpy.histogram的另一有用之处是将输出绘制为线图上的x和y坐标。例如:

1
2
3
4
5
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

这对于可视化直方图可能是一种有用的方法,在这种情况下,您希望获得更高的粒度级别,而无需到处都是条形。在图像直方图中用于识别极端像素值非常有用。