首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >numpy.histogram()是如何工作的?

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

Stack Overflow用户
提问于 2012-02-04 22:56:41
回答 3查看 248.3K关注 0票数 133

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

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

通过谷歌搜索,我找到了definition of Histograms in general。我明白了。但不幸的是,我不能将这些知识与文档中给出的例子联系起来。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-04 23:09:39

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

Numpy histogram函数不会绘制直方图,但它会计算每个条形图中输入数据的出现次数,进而确定每个条形图的面积(如果条形图的宽度不相等,则不一定是高度)。

在此示例中:

代码语言:javascript
复制
 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个等宽分布在最小输入值和最大输入值之间的存储箱。

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

由于此处的存储箱具有相同的宽度,因此您可以使用每个条形的高度的引用次数。绘制后,您将拥有:

  • 一个高度为0的条形,代表范围/条柱0,1在X轴上,
  • 一个高度为2的条形,代表范围/条柱1,2,
  • 一个高度为1的条形,代表范围/条柱2,3.

你可以直接用Matplotlib来绘制(它的hist函数也会返回箱子和值):

代码语言:javascript
复制
>>> 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()

票数 185
EN

Stack Overflow用户

发布于 2012-02-04 23:23:05

代码语言:javascript
复制
import numpy as np    
hist, bin_edges = np.histogram([1, 1, 2, 2, 2, 2, 3], bins = range(5))

下面,hist表示在bin #0中有0项,在bin #1中有2项,在bin #3中有4项,在bin #4中有1项。

代码语言:javascript
复制
print(hist)
# array([0, 2, 4, 1])   

bin_edges表示仓位#0是区间[0,1],仓位#1是[1,2),...,仓位#3是[3,4]。

代码语言:javascript
复制
print (bin_edges)
# array([0, 1, 2, 3, 4]))  

使用上面的代码,将输入更改为np.histogram,看看它是如何工作的。

但一张图片胜过千言万语:

代码语言:javascript
复制
import matplotlib.pyplot as plt
plt.bar(bin_edges[:-1], hist, width = 1)
plt.xlim(min(bin_edges), max(bin_edges))
plt.show()   

票数 75
EN

Stack Overflow用户

发布于 2017-12-29 05:33:15

使用numpy.histogram的另一件有用的事情是在折线图上将输出绘制为x和y坐标。例如:

代码语言:javascript
复制
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()

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

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9141732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档