numpy.var#
- numpy.var(a, axis=None, dtype=None, out=None, ddof=0, keepdims=<no value>, *, where=<no value>, mean=<no value>, correction=<no value>)[source]#
沿指定軸計算變異數。
傳回陣列元素的變異數,這是分布分散程度的度量。預設情況下,變異數是針對展平的陣列計算,否則是在指定的軸上計算。
- 參數:
- a類陣列
包含想要計算變異數的數字的陣列。如果 a 不是陣列,則會嘗試轉換。
- axisNone 或 int 或 int 元組,選填
計算變異數的軸或多個軸。預設值是計算展平陣列的變異數。如果這是 int 元組,則會在多個軸上執行變異數計算,而不是像以前那樣在單個軸或所有軸上執行。
- dtype資料類型,選填
用於計算變異數的類型。對於整數類型陣列,預設值為
float64
;對於浮點類型陣列,則與陣列類型相同。- outndarray,選填
放置結果的替代輸出陣列。它必須具有與預期輸出相同的形狀,但必要時會轉換類型。
- ddof{int, float},選填
“自由度差值”:計算中使用的除數為
N - ddof
,其中N
代表元素數量。預設情況下,ddof 為零。有關 ddof 使用的詳細資訊,請參閱「Notes」。- keepdimsbool,選填
如果設定為 True,則縮減的軸將保留在結果中,作為大小為一的維度。使用此選項,結果將會針對輸入陣列正確廣播。
如果傳遞預設值,則 keepdims 將不會傳遞到
var
方法,該方法是ndarray
子類別的方法,但是任何非預設值都會傳遞。如果子類別的方法未實作 keepdims,則會引發任何例外。- wherebool 類陣列,選填
要包含在變異數中的元素。有關詳細資訊,請參閱
reduce
。在版本 1.20.0 中新增。
- mean類陣列,選填
提供平均值以防止重新計算。平均值應具有如同使用
keepdims=True
計算的形狀。平均值計算的軸應與呼叫此 var 函數中使用的軸相同。在版本 2.0.0 中新增。
- correction{int, float},選填
與 Array API 相容的
ddof
參數名稱。一次只能提供其中一個。在版本 2.0.0 中新增。
- 傳回值:
- variancendarray,請參閱上面的 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`
引數 ddof 的不同值在不同的上下文中很有用。NumPy 的預設值
ddof=0
對應於表達式\[\frac{\sum_i{|a_i - \bar{a}|^2 }}{N}\]在統計學領域中,這有時稱為「母體變異數」,因為它將變異數的定義應用於 a,就好像 a 是可能觀測值的完整母體。
許多其他程式庫以不同的方式定義陣列的變異數,例如
\[\frac{\sum_i{|a_i - \bar{a}|^2}}{N - 1}\]在統計學中,結果量有時稱為「樣本變異數」,因為如果 a 是來自較大母體的隨機樣本,則此計算提供母體變異數的無偏估計值。分母中使用 \(N-1\) 通常稱為「貝索校正」,因為它可以校正當使用 a 的樣本平均值代替母體的真實平均值時,變異數估計中引入的偏差(朝向較低的值)。對於此量,請使用
ddof=1
。請注意,對於複數,在平方之前會取絕對值,因此結果始終為實數且非負數。
對於浮點輸入,變異數是使用與輸入相同的精度計算的。根據輸入資料,這可能會導致結果不準確,尤其是對於
float32
(請參閱下面的範例)。使用dtype
關鍵字指定更高精度的累加器可以緩解此問題。範例
>>> import numpy as np >>> a = np.array([[1, 2], [3, 4]]) >>> np.var(a) 1.25 >>> np.var(a, axis=0) array([1., 1.]) >>> np.var(a, axis=1) array([0.25, 0.25])
在單精度中,var() 可能不準確
>>> a = np.zeros((2, 512*512), dtype=np.float32) >>> a[0, :] = 1.0 >>> a[1, :] = 0.1 >>> np.var(a) np.float32(0.20250003)
以 float64 計算變異數更準確
>>> np.var(a, dtype=np.float64) 0.20249999932944759 # may vary >>> ((1-0.55)**2 + (0.1-0.55)**2)/2 0.2025
指定 where 引數
>>> a = np.array([[14, 8, 11, 10], [7, 9, 10, 11], [10, 15, 5, 10]]) >>> np.var(a) 6.833333333333333 # may vary >>> np.var(a, where=[[True], [True], [False]]) 4.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("var = np.var(a, axis=1, mean=mean)", globals=g, number=n) >>> t2 = timeit("var = np.var(a, axis=1)", globals=g, number=n) >>> print(f'Percentage execution time saved {100*(t2-t1)/t2:.0f}%') Percentage execution time saved 32%