y
est un objet mpc
et y.real
est un objet mpf
. numpy ne sait rien de ces objets, donc quand vous appelez np.arcsin(y)
, le code numpy vérifie si l'argument a une méthode arcsin()
(c'est-à-dire qu'il recherche y.arcsin()
). Si c'est le cas, il appellera cette fonction pour calculer l'arcsin. Les objets mpc
et mpf
n'ont pas une telle méthode, ce qui entraîne l'erreur que vous voyez. (Ce serait bien si le message d'erreur dit quelque chose comme « numpy ne sait pas comment calculer la arcsin d'un objet MPF ».)
est ici le même comportement démontré par un autre objet:
In [10]: class Foo:
...: pass
...:
In [11]: f = Foo()
In [12]: np.arcsin(f)
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-12-aa4b1a80cd4e> in <module>()
----> 1 np.arcsin(f)
AttributeError: Foo instance has no attribute 'arcsin'
comme l'a souligné dans un commentaire par Hannebambel, vous pouvez utiliser mpmath.asin
au lieu de np.arcsin
:
In [6]: import mpmath
In [7]: y = sn(0.5, -1)
In [8]: mpmath.asin(y)
Out[8]: mpc(real='0.52001273608158616', imag='0.0')
pour utiliser la fonction numpy arcsin
, d'abord convertir en virgule flottante simple ou complexe en passant t il des objets mpc
et mpf
à travers les fonctions BUILTIN complex()
et float()
, respectivement:
In [19]: y
Out[19]: mpc(real='0.49689119041931196', imag='0.0')
In [20]: np.arcsin(float(y.real))
Out[20]: 0.52001273608158627
In [21]: np.arcsin(complex(y))
Out[21]: (0.52001273608158616+0j)
Ou utiliser math.asin
au lieu de numpy.arcsin
:
In [25]: import math
In [26]: math.asin(y.real)
Out[26]: 0.5200127360815863
J'ai besoin d'autres paquets pour le repos de mon programme. Donc je les importe. – user43280