Skip to main content
 首页 » 编程设计

python之numpy 操作的顺序不等于逻辑(以及 Octave )

2025年05月04日13yxwkf

也许这个问题应该严格在 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 这没有意义。