Numpy.柱状图()是如何工作的?

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

它是用来做什么的? 在文件中他们提到了 垃圾桶: 它们是什么?

通过谷歌我找到了 一般直方图的定义。我明白。但不幸的是,我不能将这些知识与文档中给出的例子联系起来。

268138 次浏览

Bin 是一个范围,表示沿 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]) ,尽管它也返回结果中的箱子,因为它可以从输入中自动选择它们,如果没有指定的话。例如,如果 bins=5,它将在最小输入值和最大输入值之间使用5个等宽的容器。

输入值是1、2和1。因此,bin“1 to 2”包含两个匹配项(两个 1值) ,bin“2 to 3”包含一个匹配项(2)。这些结果位于返回的元组中的第一项: array([0, 2, 1])

由于这里的箱子的宽度相等,所以可以使用每个条的高度的出现次数。当你被抽中时,你会:

  • 一个高度为0的条,表示 X 轴上的范围/箱[0,1] ,
  • 量程/箱[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

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表示 bin # 0是间隔[0,1) ,bin # 1是[1,2) ,... , Bin # 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()

enter image description here

使用 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

这可能是一个有用的方法来可视化直方图,您想要一个更高的粒度水平,没有到处都是条形。非常有用的图像直方图识别极端的像素值。