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 具有相同形狀的序列列表。如果 values 是這樣一個列表,則將獨立計算每個列表的統計量。

statistic字串或可呼叫物件,選填

要計算的統計量 (預設為 ‘mean’)。以下統計量可用

  • ‘mean’ : 計算每個箱子內點的數值平均值。空箱子將以 NaN 表示。

  • ‘median’ : 計算每個箱子內點的數值中位數。空箱子將以 NaN 表示。

  • ‘count’ : 計算每個箱子內點的計數。這與未加權的直方圖相同。不會參考 values 陣列。

  • ‘sum’ : 計算每個箱子內點的數值總和。這與加權直方圖相同。

  • ‘std’ : 計算每個箱子內的標準差。這是使用 ddof=0 隱式計算的。如果給定箱子內數值的數量為 0 或 1,則計算出的標準差值將為 0。

  • ‘min’ : 計算每個箱子內點的數值最小值。空箱子將以 NaN 表示。

  • ‘max’ : 計算每個箱子內點的數值最大值。空箱子將以 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_2d範例 章節。

binned_statistic_resultbinnedStatisticddResult

為了使用新的數值和/或不同的統計量來重複使用箱子邊緣和箱號,先前呼叫函數的結果。若要重複使用箱號,expand_binnumbers 必須設定為 False (預設值)

在版本 0.17.0 中新增。

傳回值:
statistic (統計量)ndarray,形狀為 (nx1, nx2, nx3,…)

每個二維箱子中選定統計量的值。

bin_edges (箱子邊緣)ndarray 列表

描述每個維度的 (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 的每個元素對應到其對應的箱子 (使用 row-major 排序)。如果為 ‘True’:傳回的 binnumber 是一個形狀為 (D,N) 的 ndarray,其中每一行分別指示每個維度的箱子位置。在每個維度中,i 的箱號表示對應的值介於 (bin_edges[D][i-1], bin_edges[D][i]) 之間,對於每個維度 ‘D’。

在版本 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