列的列总和-两种方法,两种不同的结果

时间:2019-04-02 12:00:47

标签: python-3.x numpy floating-point sum floating-accuracy

在此示例中,以两种不同的方式计算数组pr的列式总和:

(a)使用p.sum的{​​{1}}参数

获取第一轴上的总和。

(b)沿第二个轴对数组进行切片,并取每个切片的总和

axis

两个方法都应返回相同的结果,但是由于某种原因,在此示例中,它们都不返回。如下图所示,import matplotlib.pyplot as plt import numpy as np m = 100 n = 2000 x = np.random.random_sample((m, n)) X = np.abs(np.fft.rfft(x)).T frq = np.fft.rfftfreq(n) total = X.sum(axis=0) c = frq @ X / total df = frq[:, None] - c pr = df * X a = np.sum(pr, axis=0) b = [np.sum(pr[:, i]) for i in range(m)] fig, ax = plt.subplots(1) ax.plot(a) ax.plot(b) plt.show() a的值完全不同。但是,差异是如此之小,以至于b为True。

Plot <code>a</code> and <code>b</code>

如果将np.allclose(a, b)替换为一些小的随机值,则两种求和方法之间没有区别:

pr

Plot of <code>a</code> and <code>b</code> set with random values

第二个示例表明,第一个示例的总和之差与求和方法无关。那么,这与浮点值求和有关吗?如果是这样,为什么在第二个示例中没有出现这种效果?

为什么第一个示例中的按列求和不同,哪个是正确的?

1 个答案:

答案 0 :(得分:4)

关于结果为何不同的信息,请参见https://stackoverflow.com/a/55469395/7207392。切片情况使用成对求和,轴情况不使用。

哪个是正确的?好吧,也许两者都不行,但是成对求和预计会更准确。

实际上,我们可以看到它与使用math.fsum获得的精确结果(在机器精度内)非常接近。

enter image description here