scipy.stats.

binned_statistic_dd#

scipy.stats.binned_statistic_dd(sample, values, statistic='mean', bins=10, range=None, expand_binnumbers=False, binned_statistic_result=None)[source]#

计算一组数据的多维箱式统计。

这是 histogramdd 函数的概括。直方图将空间划分为箱体,并返回每个箱体中的点数。此函数允许计算每个箱体中值的总和、平均值、中位数或其他统计数据。

参数:
samplearray_like

作为长度为 D 的 N 个数组的序列或 (N,D) 数组传递的直方图数据。

values(N,) array_like 或 (N,) array_like 的列表

将在其上计算统计数据的点。这必须与sample 形状相同,或序列列表(每个序列的维度与sample 的维度相同)。如果是序列列表,则将在每个序列中独立计算统计数据。

statistic字符串或可调用函数,可选

要计算的统计数据(默认值是“均值”)。以下统计数据可用

  • “均值”:计算每个箱中数据点的均值。空箱将用 NaN 表示。

  • “中值”:计算每个箱中数据点的中值。空箱将用 NaN 表示。

  • “计数”:计算每个箱中数据点的计数。这与未加权直方图相同。values 数组未引用。

  • “和”:计算每个箱中数据点的和。这与加权直方图相同。

  • “std”:计算每个箱中的标准差。这会使用 ddof=0 隐式计算。如果给定箱中的数据点的数量为 0 或 1,则计算得到的用于该箱的标准差值为 0。

  • “最小”:计算每个箱中数据点的最小值。空箱将用 NaN 表示。

  • “最大”:计算每个箱中数据点的最大值。空箱将用 NaN 表示。

  • function:用户定义的函数,它接受值的一维数组,并输出一个数字统计数据。此函数将对每个箱中的值执行该函数。空箱将用 function([]) 表示,如果该函数返回错误,则表示为 NaN。

bins序列或正整数,可选

直方图的规格必须采用以下形式之一

  • 一系列描述各个维度上的箱边沿的数组。

  • 每个维度上的箱数(nx, ny, … = bins)。

  • 所有维度上的箱数(nx = ny = … = bins)。

range序列,可选

如果未在bins中显式提供边沿,则用于边沿的一系列下边沿和上边沿。默认值为各个维度上的最小值和最大值。

expand_binnumbers布尔值,可选

“False”(默认):返回的 binnumber 是一个形状为 (N,) 的线性化回收箱索引数组。 “True”:返回的 binnumber “解开”为形状为 (D,N) 的 ndarray,其中每行给出了相应维度的回收箱编号。 请参阅 binnumber 返回值以及 binned_statistic_2dExamples 部分。

binned_statistic_resultbinnedStatisticddResult

针对函数的先前调用产生的结果,以便使用新值和/或不同的统计数据重新使用回收箱边缘和回收箱编号。 要重新使用回收箱编号,必须将 expand_binnumbers 设置为 False(默认值)

0.17.0 版本中新增。

返回:
statisticndarray,形状为 (nx1, nx2, nx3,...)

每个二维回收箱中所选统计数据的数值。

bin_edgesndarray 列表

描述每个维度的 (nxi + 1) 回收箱边缘的 D 数组列表。

binnumber(N,) 整型数组或 (D,N) 整型 ndarray

这将 sample 的每个元素分配一个整数,该整数表示此观测落入的回收箱。表示取决于 expand_binnumbers 参数。 有关详细信息,请参阅 Notes

注释

回收箱边缘:每个维度中最后一个(最右侧)回收箱除外都是半开的。换句话说,如果 bins[1, 2, 3, 4],则第一个回收箱是 [1, 2)(包括 1,但不包括 2),第二个是 [2, 3)。但是,最后一个回收箱是 [3, 4],其中包括4。

binnumber:此返回参数将 sample 的每个元素指定为一个整数,它表示该元素所属的区段。此表示取决于 expand_binnumbers 参数。如果是“False”(默认):返回的 binnumber 为形状为 (N,) 的数组, 线性化指标将 sample 的每个元素映射到其对应的区段(使用行优先顺序)。如果是“True”:返回的 binnumber 为形状为 (D,N) 的 ndarray,其中每行分别指示每个维度的区段放置。在每个维度中,i 的区段号表示对于每个维度“D”,相应的值介于 (bin_edges[D][i-1], bin_edges[D][i]) 之间。

于 0.11.0 版中添加。

示例

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

以 600 个 (x, y) 坐标的数组为例。 binned_statistic_dd 可以处理维度更高的数组 D。但需要维度为 D+1 的绘图。

>>> mu = np.array([0., 1.])
>>> sigma = np.array([[1., -0.5],[-0.5, 1.5]])
>>> multinormal = stats.multivariate_normal(mu, sigma)
>>> data = multinormal.rvs(size=600, random_state=235412)
>>> data.shape
(600, 2)

创建区段并计算有多少数组落入每个区段

>>> N = 60
>>> x = np.linspace(-3, 3, N)
>>> y = np.linspace(-3, 4, N)
>>> ret = stats.binned_statistic_dd(data, np.arange(600), bins=[x, y],
...                                 statistic='count')
>>> bincounts = ret.statistic

设置条形图的体积和位置

>>> dx = x[1] - x[0]
>>> dy = y[1] - y[0]
>>> x, y = np.meshgrid(x[:-1]+dx/2, y[:-1]+dy/2)
>>> z = 0
>>> bincounts = bincounts.ravel()
>>> x = x.ravel()
>>> y = y.ravel()
>>> fig = plt.figure()
>>> ax = fig.add_subplot(111, projection='3d')
>>> with np.errstate(divide='ignore'):   # silence random axes3d warning
...     ax.bar3d(x, y, z, dx, dy, bincounts)

使用新值重新利用区段编号和区段边缘

>>> ret2 = stats.binned_statistic_dd(data, -np.arange(600),
...                                  binned_statistic_result=ret,
...                                  statistic='mean')
../../_images/scipy-stats-binned_statistic_dd-1.png