在 python 中整合直方图?

Integrate histogram in python?

matplotlib中有没有一个简单的命令让我在一定范围内对直方图进行积分?如果我绘制直方图: 图 = plt.hist(x, bins) 那么,有没有像fig.integral(bin1, bin2)这样的命令呢?那将return从bin1到bin2的直方图的积分?

首先,请记住积分只是曲线下方的总面积。在直方图的情况下,积分(伪python)是sum([bin_width[i] * bin_height[i] for i in bin_indexes_to_integrate])

作为参考,请参阅在 matplotlib 中使用直方图的示例:http://matplotlib.org/1.2.1/examples/pylab_examples/histogram_demo.html

这里他们将 plt.histogram 的输出分成三部分,nbinspatches。我们可以使用这种分离来实现您这样请求的 "integral"。

假设 bin1bin2 是您要积分的 bin 的索引,然后像这样计算积分:

# create some dummy data to make a histogram of
import numpy as np
x = np.random.randn(1000)
nbins = 10
# use _ to assign the patches to a dummy variable since we don't need them
n, bins, _ = plt.hist(x, nbins)

# get the width of each bin
bin_width = bins[1] - bins[0]
# sum over number in each bin and mult by bin width, which can be factored out
integral = bin_width * sum(n[bin1:bin2])

如果您已将 bins 定义为具有多个宽度的列表,则必须执行类似于 @cphlewis 所说的操作(这有效,没有一个):

integral = sum(np.diff(bins[bin1:bin2])*n[bin1:bin2]) 

API documentation for matplotlib.pyplot.hist.

也值得一看

plt.hist命令returns所有你需要的数据制作一个。如果 out = plt.hist(...),bin 高度为 out[0],bin 宽度为 diff(out[1])。例如,

sum(out[0][4:7]*diff(out[1][4:8]))

对于 bins 4-6(含)的积分。 diff 计算每个 bin 宽度,因此它处理不同宽度的 bin,并且乘法发生在元素方面,因此计算直方图中每个矩形的面积。