Peut-être que cette question devrait être strictement dans les utilisateurs scipy, mais je vais essayer ici aussi.L'ordre des opérandes numpy n'est pas égal à la logique (et aussi à l'octave)?
Voici donc quelque chose que j'ai découvert récemment et qui me fait réfléchir.
Je veux définir un scalaire que j'appelle Net Absolute Mass Balance Error ou en abrégé NAMBE. Cette Nambé est la différence absolue entre un vecteur de base et un autre vecteur, divisé par le vecteur de base et multiplié par cent, en notation pseudo-code:
NAMBE=sum(abs(a-b)/a)*100
Quand je le fais en python, j'ai décidé de rompre la ligne en deux lignes de sorte que le code est plus lisible:
>>> 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
Je pensais que le numpy fait élément tout sage si je le fais une ligne, j'ai remarqué que le résultat est différent:
>>> s=np.sum(abs(a-b)/a)
>>> s
5.0
maintenant Si je me vérifie sur les données que j'ai avec une octave, je reçois des résultats différents:
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
Notez que le est pas de différence dans la sortie de 9 et 10 dans Octave, bien qu'il y ait en Python ... Donc, ma question est: Pourquoi python se comporte-t-il comme ça? Lequel a raison? Octave ou Python?
Quand je vous dis que b ne peut avoir que des valeurs positives? J'aurais dû le mentionner auparavant. Je comprends l'argumentation, mais je pense que numpy devrait dans ce cas se comporter comme Octave. – Oz123
Plus, en fait, j'ai essayé votre cas de test: voici le résultat: >>> importer numpy comme np >>> a = np.array ([1,0]) >>> b = np.array ([ -1,1]) >>> np.sum (a) /np.sum (b) Comme vous pouvez le voir - il cède 0 et non Inf !!! Python dans ce cas, se comporte de façon très peu intuitive, tandis que octave donne: octave: 1> a = [1,0] a = 1 0 octave: 2> b = [- 1,1] b = -1 1 octave: 3> somme (a)/somme (b) avertissement: division par zéro ans = Inf – Oz123
@ Oz123, qui est une différence dans les erreurs de manipulation comme division par 0. la division par 0 est en réalité non définie donc la réponse n'est pas nécessairement l'infini. En numpy, il est mis à 0. La valeur par défaut de numpy est d'ignorer les erreurs en virgule flottante. Vous pouvez changer cela cependant. Par exemple, si vous utilisez 'np.seterr (all = 'warn')' alors vous serez averti de la division par 0. En passant, je dirais qu'Octave est en train de mal tourner la sortie 9. Je suppose qu'au lieu de faire la division élément par élément en divisant deux vecteurs, il décide de diviser un vecteur par la grandeur de l'autre. –