Python:Numpy标准差错误

Mac*_*nhe 22 python numpy

这是一个简单的测试

import numpy as np
data = np.array([-1,0,1])
print data.std()

>> 0.816496580928
Run Code Online (Sandbox Code Playgroud)

我不明白这个结果是如何产生的?明显:

( (1^0.5 + 1^0.5 + 0^0.5)/(3-1) )^0.5 = 1
Run Code Online (Sandbox Code Playgroud)

在matlab它给了我std([-1,0,1]) = 1.你能帮助我理解它是如何numpy.std()工作的吗?

Bla*_*ble 20

这个问题的症结在于你需要除以N(3),而不是N-1(2).正如Iarsmans指出的那样,numpy将使用总体方差,而不是样本方差.

所以真正的答案就是sqrt(2/3):0.8164965...

如果您碰巧试图故意使用不同的值(默认值为0)作为自由度,请使用ddof带有0以外的正值的关键字参数:

np.std(data, ddof=1)
Run Code Online (Sandbox Code Playgroud)

......但这样做在这里会重新提出你原来的问题,numpy的将被划分N - ddof.


Ole*_*yar 6

在指出该函数/方法不正确之前,值得阅读该函数/方法的帮助页面。该方法完全按照文档字符串所述执行的操作,除以 3,因为默认情况下ddof为零。:

In [3]: numpy.std?

String form: <function std at 0x104222398>
File:        /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/core/fromnumeric.py
Definition:  numpy.std(a, axis=None, dtype=None, out=None, ddof=0, keepdims=False)
Docstring:
Compute the standard deviation along the specified axis.

...

ddof : int, optional
    Means Delta Degrees of Freedom.  The divisor used in calculations
    is ``N - ddof``, where ``N`` represents the number of elements.
    By default `ddof` is zero.
Run Code Online (Sandbox Code Playgroud)