2010-06-06 17 views
1

Comment puis-je calculer le z-score pour les matrices en Python?calculer des z-scores pour des matrices 2D dans scipy/numpy en Python

Supposons que je le tableau:

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

et je veux calculer le score z pour chaque ligne. La solution que je suis venu avec est:

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

où zs est dans scipy.stats.stats. Y a-t-il une meilleure façon intégrée de le faire?

De même, est-il toujours bon de z-marquer des nombres avant d'utiliser la classification hiérarchique avec une distance euclidienne ou seuclidienne? Quelqu'un peut-il discuter des avantages/inconvénients relatifs?

merci.

Répondre

3

scipy.stats.stats.zs est défini comme ceci:

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

Donc, pour l'étendre à travailler sur un axe donné d'un ndarray, vous pouvez le faire:

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))