numpy sum不同意

时间:2013-12-02 08:48:56

标签: python numpy matrix

我在一个带有小数字的矩阵上运行了一个总和(这里:https://gist.github.com/anonymous/7746735) 但如果我总结不同的方向,总和就不一致了:

>>> a = np.genfromtxt('arr.txt', delimiter=' ')
>>> a.shape
(30, 86)
>>> a.sum()
7.2164496600635175e-16
>>> a.sum(0).sum()
3.8857805861880479e-16
>>> a.sum(1).sum()
7.6327832942979512e-16

但如果我总结小矩阵,它同意:

>>> b = np.array([[1,2,3],[4,5,6]])
>>> b.sum()
21
>>> b.sum(0).sum()
21
>>> b.sum(1).sum()
21

是什么导致了这个问题?哪个总和对于第一个矩阵是正确的?谢谢!

1 个答案:

答案 0 :(得分:4)

这是由于浮点运算的固有不精确性。在数学上,联想法适用于加法。即:

a + (b + c) = (a + b) + c

但对于有限机器上的浮点运算来说,情况并非如此。当你以不同的顺序对元素求和时,你就可以得到不同的答案。

您可能想知道关联法则不适用于浮点运算。这完全取决于并非所有数字都可以表示。这可能会让您大吃一惊,但即使数字显然简单为0.1,也无法用二进制浮点数据类型来表示。

因此,当计算机计算a + b时,真正的确切结果可能无法表示。计算机尽其所能,并为您提供最接近可准确表示的确切值的数字。这就是出现不精确的地方。

有关此主题的必读内容:What Every Computer Scientist Should Know About Floating-Point Arithmetic

  

第一个矩阵的哪个和是正确的?

这是不可能从这里说的,虽然几乎肯定没有一个是完全正确的。您在矩阵a中保存的值很可能已经接近真值,因此即使正确的定义也很难确定。