也许这个问题应该严格在 scipy-users 中,但我也会在这里尝试。
所以这是我最近发现的东西,让我想知道。
我想定义一个标量,我称之为净绝对质量平衡误差或简称 NAMBE。 这个 NAMBE 是一个基向量和另一个向量之间的绝对差除以基向量再乘以一百,用伪代码表示:
NAMBE=sum(abs(a-b)/a)*100
当我用 python 做的时候,我决定把一行分成两行,这样代码就更多了 可读性:
>>> a=np.array([0.1,0.1,0.1,0.1,0.1])
>>> b=np.array([0.1,0.1,0.1,0.1,0.1])*2
>>> b
array([ 0.2, 0.2, 0.2, 0.2, 0.2])
>>> a-b
array([-0.1, -0.1, -0.1, -0.1, -0.1])
>>> s=np.sum(abs(a-b))
>>> s
0.5
>>> s/np.sum(a)
1.0
我认为 numpy 会明智地处理所有元素,所以如果我只做一行,我注意到结果是不同的:
>>> s=np.sum(abs(a-b)/a)
>>> s
5.0
现在,如果我用 Octave 音程检查自己的数据,我会得到不同的结果:
octave:1> a=[0.1,0.1,0.1,0.1,0.1]
a =
0.10000 0.10000 0.10000 0.10000 0.10000
octave:2> b=a*2
b =
0.20000 0.20000 0.20000 0.20000 0.20000
octave:3> sum(a)
ans = 0.50000
octave:4> sum(b)
ans = 1
octave:5> sum(a-b)
ans = -0.50000
octave:6> sum(abs(a-b))
ans = 0.50000
octave:7> s=sum(abs(a-b))
s = 0.50000
octave:8> s/sum(a)
ans = 1
octave:9> s=sum(abs(a-b)/a)
s = 1.0000
octave:10> s=sum(abs(a-b)/sum(a))
s = 1
请注意,Octave 中 9 和 10 的输出没有区别,尽管在 Python 中... 所以,我的问题是: 为什么 python 会这样?哪一个是对的? Octave 还是 Python?
请您参考如下方法:
sum(a-b)/sum(a) 与 sum((a-b)/a) 不同。
考虑例如a=[1,0] 和 b=[-1,1]。然后 sum(a/b) == sum([-1,0]) == -1,但是 sum(a)/(sum(b) == 1/0 这没有意义。
