numpy.histogram()如何工作?


119

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

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

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

Answers:


166

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

脾气暴躁 histogram函数不会绘制直方图,但是会计算落在每个仓中的输入数据的出现次数,这反过来又确定了每个条的面积(如果仓的宽度不相等,则不一定是高度)。

在此示例中:

 np.histogram([1, 2, 1], bins=[0, 1, 2, 3])

共有3个档位,其值分别从0到1(不包括1),1到2(不包括2)和2到3(包括3)。[0, 1, 2, 3]在本示例中,Numpy通过给出定界符列表()来定义这些bin ,尽管它也会返回结果中的bin,因为如果未指定,则可以从输入中自动选择它们。如果bins=5,例如,它会使用5桶相等宽度传播的最小输入值和最高输入值之间。

输入值为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函数还会返回垃圾箱和值):

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

在此处输入图片说明


8
如果要绘制它们,您可能也对此答案感兴趣。Matplotlib也可以直接计算它们在此处此处查看示例。
布鲁诺

在鸢尾花数据集中,计数,bin_edges = np.histogram(iris_setosa ['petal_length'],bins = 10,density = True)为我提供了浮点数的计数,根据您给出的示例,如何将计数变为浮动价值?
Dipen Gajjar,

最佳答案应考虑到最大右边缘以上的大量值将被忽略。始终将网格边缘上方的值添加到最后一个容器中,或将最后手动创建的bins值更改为数组中的最大值。
A.Ametov '19

@DipenGajjar如果省略“ density = True”,则不会看到。density关键字为您提供了一个“归一化”直方图,其中表示了概率密度函数。你可以在这里阅读。
BUFU

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

在此处输入图片说明


4
我认为这会更准确:plt.bar(bin_edges[:-1], hist, width=1)plt.xlim(min(bin_edges), max(bin_edges)),以使条形图适合其期望的宽度(否则,可能会有一个较小的bin,中间没有任何值)。
布鲁诺

是否可以在“ plt.hist(...)”函数中使用以上述numpy格式获取的“ hist”?因为在bar方法中,您将其提供为“ y”,而在hist中,此处仅存在x
。。– kbg,

7

另一个有用的事情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()

在此处输入图片说明

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


这对于查看图像的行和列投影非常有用。
SKR
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.