当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python SciPy stats.binned_statistic用法及代码示例


本文简要介绍 python 语言中 scipy.stats.binned_statistic 的用法。

用法:

scipy.stats.binned_statistic(x, values, statistic='mean', bins=10, range=None)#

计算一组或多组数据的分箱统计量。

这是直方图函数的推广。直方图将空间划分为多个 bin,并返回每个 bin 中的点数。此函数允许计算每个 bin 内的值(或值集)的总和、平均值、中位数或其他统计量。

参数

x (N,) 数组

要分箱的一系列值。

values (N,) 数组 或 (N,) 数组 列表

将根据其计算统计数据的数据。这必须与 x 具有相同的形状,或者是一组序列 - 每个都与 x 具有相同的形状。如果 values 是一组序列,则将独立计算每个序列的统计量。

statistic 字符串或可调用,可选

要计算的统计数据(默认为‘mean’)。可用的统计数据如下:

  • ‘mean’ : compute the mean of values for points within each bin. Empty bins will be represented by NaN.

  • ‘std’ : compute the standard deviation within each bin. This is implicitly calculated with ddof=0.

  • ‘median’ : compute the median of values for points within each bin. Empty bins will be represented by NaN.

  • ‘count’ : compute the count of points within each bin. This is identical to an unweighted histogram. values array is not referenced.

  • ‘sum’ : compute the sum of values for points within each bin. This is identical to a weighted histogram.

  • ‘min’ : compute the minimum of values for points within each bin. Empty bins will be represented by NaN.

  • ‘max’ : compute the maximum of values for point within each bin. Empty bins will be represented by NaN.

  • function : a user-defined function which takes a 1D array of values, and outputs a single numerical statistic. This function will be called on the values in each bin. Empty bins will be represented by function([]), or NaN if this returns an error.

bins int 或标量序列,可选

如果箱子是一个 int,它定义了给定范围内的equal-width bin 的数量(默认为 10)。如果箱子是一个序列,它定义了 bin 边,包括最右边的边,允许不均匀的 bin 宽度。值x小于最低 bin 边的被分配给 bin 编号 0,超出最高 bin 的值被分配给bins[-1].如果指定了 bin 边,则 bin 的数量将为 (nx = len(bins)-1)。

range (float, float) 或 [(float, float)], 可选

bin 的下限和上限范围。如果未提供,范围只是 (x.min(), x.max()) 。超出范围的值将被忽略。

返回

statistic 数组

每个 bin 中所选统计数据的值。

bin_edges dtype 浮点数组

返回 bin 边 (length(statistic)+1)

binnumber:一维整数数组

x 的每个值所属的 bin 的索引(对应于bin_edges)。与值的长度相同。 binnumber 为 i 表示对应的值介于 (bin_edges[i-1], bin_edges[i]) 之间。

注意

除了最后一个 (righthand-most) 箱子之外的所有箱子都是半开的。换句话说,如果箱子[1, 2, 3, 4],那么第一个 bin 是[1, 2)(包括1个,但不包括2个)和第二个[2, 3).然而,最后一个箱子是[3, 4], 哪一个包括 4.

例子

>>> import numpy as np
>>> from scipy import stats
>>> import matplotlib.pyplot as plt

首先是一些基本的例子:

在给定样本的范围内创建两个均匀间隔的 bin,并对每个 bin 中的相应值求和:

>>> values = [1.0, 1.0, 2.0, 1.5, 3.0]
>>> stats.binned_statistic([1, 1, 2, 5, 7], values, 'sum', bins=2)
BinnedStatisticResult(statistic=array([4. , 4.5]),
        bin_edges=array([1., 4., 7.]), binnumber=array([1, 1, 1, 2, 2]))

也可以传递多个值数组。统计量是在每个集合上独立计算的:

>>> values = [[1.0, 1.0, 2.0, 1.5, 3.0], [2.0, 2.0, 4.0, 3.0, 6.0]]
>>> stats.binned_statistic([1, 1, 2, 5, 7], values, 'sum', bins=2)
BinnedStatisticResult(statistic=array([[4. , 4.5],
       [8. , 9. ]]), bin_edges=array([1., 4., 7.]),
       binnumber=array([1, 1, 1, 2, 2]))
>>> stats.binned_statistic([1, 2, 1, 2, 4], np.arange(5), statistic='mean',
...                        bins=3)
BinnedStatisticResult(statistic=array([1., 2., 4.]),
        bin_edges=array([1., 2., 3., 4.]),
        binnumber=array([1, 2, 1, 2, 3]))

作为第二个例子,我们现在生成一些作为风速函数的帆船速度的随机数据,然后确定我们的船在特定风速下的速度:

>>> rng = np.random.default_rng()
>>> windspeed = 8 * rng.random(500)
>>> boatspeed = .3 * windspeed**.5 + .2 * rng.random(500)
>>> bin_means, bin_edges, binnumber = stats.binned_statistic(windspeed,
...                 boatspeed, statistic='median', bins=[1,2,3,4,5,6,7])
>>> plt.figure()
>>> plt.plot(windspeed, boatspeed, 'b.', label='raw data')
>>> plt.hlines(bin_means, bin_edges[:-1], bin_edges[1:], colors='g', lw=5,
...            label='binned statistic of data')
>>> plt.legend()

现在我们可以使用 binnumber 来选择风速低于 1 的所有数据点:

>>> low_boatspeed = boatspeed[binnumber == 0]

作为最后一个示例,我们将使用 bin_edgesbinnumber 在常规直方图和概率分布函数之上绘制一个分布图,显示每个 bin 的平均值和围绕该平均值的分布:

>>> x = np.linspace(0, 5, num=500)
>>> x_pdf = stats.maxwell.pdf(x)
>>> samples = stats.maxwell.rvs(size=10000)
>>> bin_means, bin_edges, binnumber = stats.binned_statistic(x, x_pdf,
...         statistic='mean', bins=25)
>>> bin_width = (bin_edges[1] - bin_edges[0])
>>> bin_centers = bin_edges[1:] - bin_width/2
>>> plt.figure()
>>> plt.hist(samples, bins=50, density=True, histtype='stepfilled',
...          alpha=0.2, label='histogram of data')
>>> plt.plot(x, x_pdf, 'r-', label='analytical pdf')
>>> plt.hlines(bin_means, bin_edges[:-1], bin_edges[1:], colors='g', lw=2,
...            label='binned statistic of data')
>>> plt.plot((binnumber - 0.5) * bin_width, x_pdf, 'g.', alpha=0.5)
>>> plt.legend(fontsize=10)
>>> plt.show()
scipy-stats-binned_statistic-1_00.png
scipy-stats-binned_statistic-1_01.png

相关用法


注:本文由纯净天空筛选整理自scipy.org大神的英文原创作品 scipy.stats.binned_statistic。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。