Порядок numpy orperations не равен логике (а также октавы)? - PullRequest
1 голос
/ 31 октября 2010

Может быть, этот вопрос должен быть строго задуман пользователями, но я попробую и здесь.

Так вот, что я обнаружил в последнее время и заставляет задуматься.

Я хочу определить скаляр, который я называю Net Absolute Mass Balance Error или, кратко, 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: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

Обратите внимание, что нет никакой разницы в выходных данных 9 и 10 в октаве, хотяесть в Python ... Итак, мой вопрос: почему Python ведет себя так?Какой из них прав?Октава или Питон?

1 Ответ

7 голосов
/ 31 октября 2010

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, что не имеет смысла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...