使用 scipy 和 numpy 中的函数计算 z 分数

Posted

技术标签:

【中文标题】使用 scipy 和 numpy 中的函数计算 z 分数【英文标题】:compute z-score with the function in scipy and numpy 【发布时间】:2017-10-25 19:55:24 【问题描述】:

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

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

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

    

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

【问题讨论】:

stats.zscore 默认情况下沿轴 0 工作(它不会像 mean 和 std 函数那样展平整个数组)。它的行为本质上是(a - a.mean(axis=0)) / a.std(axis=0) (*它的行为 - 请原谅我的语法) - 尝试stats.zscore(a, axis=None) 以获得与二维数组的 NumPy 相同的结果。 @Alex:这看起来像是一个答案。 :) @AlexRiley,谢谢,这就是答案! 【参考方案1】:

由于没有人添加答案而且似乎是正确的,我将在此处发布 Alex Riley 的答案。

试试这个,以获得相同的二维数组结果。

from scipy import stats

stats.zscore(a, axis=None)

【讨论】:

以上是关于使用 scipy 和 numpy 中的函数计算 z 分数的主要内容,如果未能解决你的问题,请参考以下文章

N点与numpy/scipy中的参考之间的有效距离计算

numpy/scipy中非线性函数的数值梯度

如何使用 python + NumPy / SciPy 计算滚动/移动平均值?

numpy 和 scipy 中的阶乘

从平均值和标准差计算 Z 分数

初步理解Numpy, Scipy, matplotib, pandas,