2010-06-06 149 views
1

如何計算Python中矩陣的z分數?在Python中使用scipy/numpy計算2D矩陣的z分數

假設我有數組:

a = array([[ 1, 2, 3], 
      [ 30, 35, 36], 
      [2000, 6000, 8000]]) 

,我想計算Z值的每一行。我想出的解決方案是:

array([zs(item) for item in a]) 

其中zs在scipy.stats.stats中。有沒有更好的內置矢量化方式來做到這一點?

此外,使用層次聚類與歐幾里德距離或seuclidean距離之前,z-score數字總是好嗎?任何人都可以討論相對的優點/缺點嗎?

謝謝。

回答

3

scipy.stats.stats.zs的定義是這樣的:

def zs(a): 
    mu = mean(a,None) 
    sigma = samplestd(a) 
    return (array(a)-mu)/sigma 

所以把它擴大到上ndarray的定軸工作,你可以這樣做:

import numpy as np 
import scipy.stats.stats as sss 
def my_zs(a,axis=-1): 
    b=np.array(a).swapaxes(axis,-1)  
    mu = np.mean(b,axis=-1)[...,np.newaxis] 
    sigma = sss.samplestd(b,axis=-1)[...,np.newaxis] 
    return (b-mu)/sigma 


a = np.array([[ 1, 2, 3], 
      [ 30, 35, 36], 
      [2000, 6000, 8000]])  
result=np.array([sss.zs(item) for item in a]) 

my_result=my_zs(a) 
print(my_result) 
# [[-1.22474487 0.   1.22474487] 
# [-1.3970014 0.50800051 0.88900089] 
# [-1.33630621 0.26726124 1.06904497]] 
assert(np.allclose(result,my_result))