在Python中使用scipy/numpy计算二维矩阵的z-score

2 投票
2 回答
7056 浏览
提问于 2025-04-15 23:37

我怎样才能在Python中计算矩阵的z-score呢?

假设我有一个数组:

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

我想计算每一行的z-score。我想到的解决办法是:

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

这里的zs来自scipy.stats.stats。有没有更好的内置向量化方法来做到这一点呢?

另外,在使用欧几里得距离或加权欧几里得距离进行层次聚类之前,是否总是应该对数字进行z-score处理?有没有人能讨论一下这两者的相对优缺点?

谢谢。

2 个回答

2

在下一个版本中,scipy的新zscore功能可以处理任意维度的数组。

http://projects.scipy.org/scipy/changeset/6169

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

撰写回答