Weird Numpy.sum Behavior When Adding Zeros
I understand how mathematically-equivalent arithmentic operations can result in different results due to numerical errors (e.g. summing floats in different orders). However, it sur
Solution 1:
Short answer: You are seeing the difference between
a + b + c + d
and
(a + b) + (c + d)
which because of floating point inaccuracies is not the same.
Long answer: Numpy implements pair-wise summation as an optimization of both speed (it allows for easier vectorization) and rounding error.
The numpy sum-implementation can be found here (function pairwise_sum_@TYPE@
). It essentially does the following:
- If the length of the array is less than 8, a regular for-loop summation is performed. This is why the strange result is not observed if
W < 4
in your case - the same for-loop summation will be used in both cases. - If the length is between 8 and 128, it accumulates the sums in 8 bins
r[0]-r[7]
then sums them by((r[0] + r[1]) + (r[2] + r[3])) + ((r[4] + r[5]) + (r[6] + r[7]))
. - Otherwise, it recursively sums two halves of the array.
Therefore, in the first case you get a.sum() = a[0] + a[1] + a[2] + a[3]
and in the second case b.sum() = (a[0] + a[1]) + (a[2] + a[3])
which leads to a.sum() - b.sum() != 0
.
Post a Comment for "Weird Numpy.sum Behavior When Adding Zeros"