numpy.std#

numpy.std(a, axis=None, dtype=None, out=None, ddof=0, keepdims=<no value>, *, where=<no value>, mean=<no value>, correction=<no value>)[原始碼]#

沿著指定的軸計算標準差。

傳回標準差,一種衡量陣列元素分佈離散程度的指標。預設情況下,標準差是針對展平的陣列計算,否則會針對指定的軸計算。

參數:
aarray_like

計算這些值的標準差。

axisNone 或 int 或 int 元組,選用

計算標準差的軸或軸。預設值是計算展平陣列的標準差。如果這是 int 元組,則會對多個軸執行標準差計算,而不是像以前那樣對單個軸或所有軸執行。

dtypedtype,選用

用於計算標準差的類型。對於整數類型陣列,預設值為 float64;對於浮點類型陣列,則與陣列類型相同。

outndarray,選用

要在其中放置結果的替代輸出陣列。它必須具有與預期輸出相同的形狀,但如果需要,將會轉換類型(計算值的類型)。有關更多詳細資訊,請參閱輸出類型判斷

ddof{int, float},選用

表示 Delta 自由度。計算中使用的除數為 N - ddof,其中 N 表示元素數量。預設情況下,ddof 為零。有關 ddof 使用的詳細資訊,請參閱「註解」。

keepdimsbool,選用

如果設定為 True,則縮減的軸將保留在結果中,作為大小為 1 的維度。使用此選項,結果將與輸入陣列正確廣播。

如果傳遞預設值,則 keepdims 將不會傳遞給 std 方法的 ndarray 子類別,但是任何非預設值都會傳遞。如果子類別的方法未實作 keepdims,則會引發任何例外。

wherearray_like of bool,選用

要包含在標準差中的元素。有關詳細資訊,請參閱 reduce

版本 1.20.0 新增。

meanarray_like,選用

提供平均值以防止重新計算。平均值應具有與使用 keepdims=True 計算時相同的形狀。平均值的計算軸應與此 std 函數呼叫中使用的軸相同。

版本 2.0.0 新增。

correction{int, float},選用

與 Array API 相容的 ddof 參數名稱。它們只能同時提供其中一個。

版本 2.0.0 新增。

傳回值:
standard_deviationndarray,請參閱上面的 dtype 參數。

如果 out 為 None,則傳回包含標準差的新陣列,否則傳回對輸出陣列的參考。

註解

陣列標準差計算有幾種常見的變體。假設輸入 a 是一維 NumPy 陣列,並且 mean 作為引數提供或計算為 a.mean(),NumPy 將陣列的標準差計算為

N = len(a)
d2 = abs(a - mean)**2  # abs is for complex `a`
var = d2.sum() / (N - ddof)  # note use of `ddof`
std = var**0.5

引數 ddof 的不同值在不同的上下文中很有用。NumPy 的預設值 ddof=0 對應於表達式

\[\sqrt{\frac{\sum_i{|a_i - \bar{a}|^2 }}{N}}\]

在統計學領域中,這有時稱為「母體標準差」,因為它將標準差的定義應用於 a,就好像 a 是可能觀察值的完整母體一樣。

許多其他程式庫以不同的方式定義陣列的標準差,例如:

\[\sqrt{\frac{\sum_i{|a_i - \bar{a}|^2 }}{N - 1}}\]

在統計學中,結果量有時稱為「樣本標準差」,因為如果 a 是來自較大母體的隨機樣本,則此計算提供母體變異數的無偏估計值的平方根。分母中使用 \(N-1\) 通常稱為「貝索校正」,因為它校正了當使用 a 的樣本平均值代替母體的真實平均值時,變異數估計中引入的偏差(朝向較低值)。標準差的結果估計值仍然有偏差,但比沒有校正時要小。對於此量,請使用 ddof=1

請注意,對於複數,std 在平方之前取絕對值,因此結果始終為實數且非負數。

對於浮點輸入,標準差是使用輸入的相同精度計算的。根據輸入資料,這可能會導致結果不準確,尤其是對於 float32(請參閱下面的範例)。使用 dtype 關鍵字指定更高精度的累加器可以減輕此問題。

範例

>>> import numpy as np
>>> a = np.array([[1, 2], [3, 4]])
>>> np.std(a)
1.1180339887498949 # may vary
>>> np.std(a, axis=0)
array([1.,  1.])
>>> np.std(a, axis=1)
array([0.5,  0.5])

在單精度中,std() 可能不準確

>>> a = np.zeros((2, 512*512), dtype=np.float32)
>>> a[0, :] = 1.0
>>> a[1, :] = 0.1
>>> np.std(a)
np.float32(0.45000005)

以 float64 計算標準差更準確

>>> np.std(a, dtype=np.float64)
0.44999999925494177 # may vary

指定 where 引數

>>> a = np.array([[14, 8, 11, 10], [7, 9, 10, 11], [10, 15, 5, 10]])
>>> np.std(a)
2.614064523559687 # may vary
>>> np.std(a, where=[[True], [True], [False]])
2.0

使用 mean 關鍵字來節省計算時間

>>> import numpy as np
>>> from timeit import timeit
>>> a = np.array([[14, 8, 11, 10], [7, 9, 10, 11], [10, 15, 5, 10]])
>>> mean = np.mean(a, axis=1, keepdims=True)
>>>
>>> g = globals()
>>> n = 10000
>>> t1 = timeit("std = np.std(a, axis=1, mean=mean)", globals=g, number=n)
>>> t2 = timeit("std = np.std(a, axis=1)", globals=g, number=n)
>>> print(f'Percentage execution time saved {100*(t2-t1)/t2:.0f}%')

Percentage execution time saved 30%