使用Scipy和Numpy中的函数计算z分数

20

我尝试在Scipy中使用stats.zscore(),并得到以下结果,让我感到困惑。

假设我有一个数组,并以2种不同的方式计算z-score:

>>> a = np.array([[1.0, 2.0], [3.0, 4.0]])
>>> a
array([[ 1.,  2.],
       [ 3.,  4.]])

第一个结果:

>>> stats.zscore(a)               
array([[-1., -1.],
       [ 1.,  1.]])

第二个结果:

>>> mean = np.mean(a)
>>> mean
2.5
>>> std = np.std(a)
>>> std
1.1180339887498949
>>> b = (a-mean)/std
>>> b
array([[-1.34164079, -0.4472136 ],
       [ 0.4472136 ,  1.34164079]])

上述结果是不同的,但如果我使用另一个数组,则会有所不同。

>>> c = np.array([ 0.7972,  0.0767,  0.4383,  0.7866,  0.8091,  0.1954, 0.6307, 0.6599,  0.1065,  0.0508])
>>> c
array([ 0.7972,  0.0767,  0.4383,  0.7866,  0.8091,  0.1954,  0.6307, 0.6599,  0.1065,  0.0508])

第一个结果:

>>> stats.zscore(c)
array([ 1.12724554, -1.2469956 , -0.05542642,  1.09231569,  1.16645923, -0.8558472 ,  0.57858329,  0.67480514, -1.14879659, -1.33234306])

第二个结果:

>>> mean = np.mean(c)
>>> mean
0.45511999999999986
>>> std = np.std(c)
>>> std
0.30346538451691657
>>> b = (c-mean)/std
>>> b
array([ 1.12724554, -1.2469956 , -0.05542642,  1.09231569,  1.16645923, -0.8558472 ,  0.57858329,  0.67480514, -1.14879659, -1.33234306])

    

所以当我使用另一个数组时,结果变得相同。有人可以帮助我理解我做错了什么吗?谢谢!


11
stats.zscore默认沿着轴0工作(不像mean和std函数一样将整个数组拉平)。其行为本质上是(a - a.mean(axis=0)) / a.std(axis=0) - Alex Riley
8
尝试使用 stats.zscore(a, axis=None) 来获取与 NumPy 中针对 2D 数组相同的结果。关于 "its behaviour",请原谅我的语法。 - Alex Riley
2
@Alex:看起来像是一个答案。 :) - Warren Weckesser
@AlexRiley,谢谢,那就是答案! - iTS
1个回答

16

由于没有人添加答案,而且似乎正确,我会在这里发布Alex Riley的答案。

尝试使用以下代码来获得相同的结果,适用于2D数组。

from scipy import stats

stats.zscore(a, axis=None)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接