1
votes

numpy renvoie nans pour exponentiel. Pure Python renvoie un résultat correct

Je suis vraiment confus par celui-ci. Peut-être que quelqu'un peut clarifier le résultat pour moi:

-3.3197780173988067

produit

array ([0.39126903, 0.47080342, 0.56661974, 0.73100461, 0.97680242, 1.42368231, 2.369756, 5.34193942, 50.47146058, nan, nan])

-0.41847852**e

me donne

[0.39126902696026267, 0.4708034172873469, 0.5666197367017416, 0.7310046117775049, 0.9768024208132248, 1.4236823077174863, 2.369756002432608, 5.341939422216064, 50.47146057971127, nan, nan]

MAIS

[item**e for item in a]

donne

import numpy as np

a = np.array([ 1.97635114,  1.72790352,  1.51046621,  1.25543557,  1.01718594,
        0.77378732,  0.53452001,  0.29627038,  0.05802074, -0.18022889,
       -0.41847852])
e = -1.377404416

a**e

Pourquoi est-ce que numpy n'est pas capable de calculer l'exponentielle de ces deux nombres?


1 commentaires

Cela pourrait être lié au débordement comme répondu dans cette question: stats.stackexchange.com/questions/367564/...


3 Réponses :


7
votes

Les racines des nombres négatifs ne sont pas définies en nombres réels. Ce que donne python est le suivant: - (0.41847852 ** e) en raison de la priorité des opérateurs. Essayez avec les parenthèses (-0.41847852) ** e :

>>> (-1.247220271970189 + 3.0765837674262926j)

Cela donne un nombre complexe. C'est pourquoi numpy les calcule comme nan . Si vous créez un tableau numpy avec dtype = 'complex' , numpy peut également les calculer.


1 commentaires

Mince. Merci. Même Wolfram Alpha m'a trompé. Le cours de calcul de base était déjà très ancien



1
votes

À l'intérieur de numpy, avec votre tableau donné, seuls les calculs avec des valeurs réelles sont effectués. En dehors de numpy, Python effectue les calculs avec des valeurs complexes.

Notez que -0.41847852 ** e est différent de (-0.41847852)**e


0 commentaires

1
votes

Pure Python vous trompe un peu ici. Ce n'est pas un nombre réel car les racines négatives sont a . Voir ci-dessous pour une solution de contournement si vous en souhaitez une. Il utilise le dtype = np.complex pour le transformer en un nombre complexe, le utilise le .real pour le changer en ce que python pur produit.

import numpy as np

a = np.array([ 1.97635114,  1.72790352,  1.51046621,  1.25543557,  1.01718594,
        0.77378732,  0.53452001,  0.29627038,  0.05802074, -0.18022889,
       -0.41847852], dtype=np.complex)
e = -1.377404416

complexAnswer = a**e
realAnswer = complexAnswer.real


0 commentaires