在查找相关问题的过程中,我偶然发现了一个事实,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。
答案 0 :(得分:1)
您可能已经注意到,这些数字相当small
。实际上,它是如此之小,以至于两者都不是特别准确。值得注意的是,实现上的细微差别实际上会导致对浮点数的不准确性做出不同的回答。在C
中的numpy的std实现中,执行轴计算的方式与此处明确进行的方式不同。
当然,沿着列的该数据的“实际”标准偏差当然是0
。