在Python中使用scipy/numpy计算2D矩阵的z分数
问题描述:
如何计算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数字总是好吗?任何人都可以讨论相对的优点/缺点吗?
谢谢。
答
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))
@ user333700:谢谢(你的)信息。 – unutbu 2010-06-07 21:02:59