指定轴时,Numpy计算不同的标准偏差

时间:2018-08-14 17:32:22

标签: python python-3.x numpy

在查找相关问题的过程中,我偶然发现了一个事实,np.std似乎返回不同的值,这取决于是否指定了axis关键字参数或手动完成了相应的掩码。请考虑以下代码段:

import numpy as np

np.random.seed(123)

a = np.empty(shape=(100, 2), dtype=float)
a[:, 0] = np.random.uniform()
a[:, 1] = np.random.uniform()

print(np.std(a, axis=0)[0] == np.std(a[:, 0]))  # Should be the same.
print(np.std(a, axis=0)[1] == np.std(a[:, 1]))  # Should be the same.

但是,两次计算不会返回相同的结果。进一步检查发现:

>>> print('axis=0: {:e} vs {:e}'.format(np.std(a, axis=0)[0], np.std(a[:, 0])))
axis=0: 7.771561e-16 vs 2.220446e-16
>>> print('axis=1: {:e} vs {:e}'.format(np.std(a, axis=0)[1], np.std(a[:, 1])))
axis=1: 4.440892e-16 vs 0.000000e+00

我不明白为什么这两种计算方式会返回不同的结果,因为它们在形式上描述了相同的过程(手动屏蔽轴或通过指定axis来让numpy发挥作用应该没有什么不同)


我正在使用Python 3.5.2和numpy 1.15.0。

1 个答案:

答案 0 :(得分:1)

您可能已经注意到,这些数字相当small。实际上,它是如此之小,以至于两者都不是特别准确。值得注意的是,实现上的细微差别实际上会导致对浮点数的不准确性做出不同的回答。在C中的numpy的std实现中,执行轴计算的方式与此处明确进行的方式不同。

当然,沿着列的该数据的“实际”标准偏差当然是0