在此示例中,以两种不同的方式计算数组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。
如果将np.allclose(a, b)
替换为一些小的随机值,则两种求和方法之间没有区别:
pr
第二个示例表明,第一个示例的总和之差与求和方法无关。那么,这与浮点值求和有关吗?如果是这样,为什么在第二个示例中没有出现这种效果?
为什么第一个示例中的按列求和不同,哪个是正确的?
答案 0 :(得分:4)
关于结果为何不同的信息,请参见https://stackoverflow.com/a/55469395/7207392。切片情况使用成对求和,轴情况不使用。
哪个是正确的?好吧,也许两者都不行,但是成对求和预计会更准确。
实际上,我们可以看到它与使用math.fsum
获得的精确结果(在机器精度内)非常接近。