2017-06-19 6 views
0

Ich habe versucht Jacobi elliptische Funktion von mpmath, aber immer den Fehler für den einfachen Code gegeben unten zu verwenden:Python: Attribute: ‚mpc‘ (oder ‚MPF‘) Objekt hat kein Attribut ‚arcsin‘

import numpy as np 
import scipy.integrate as spi 
from scipy import special as sp 
import matplotlib.pyplot as plt 
from math import sqrt, pow, log 
from mpmath import ellipfun 

sn = ellipfun('sn') 
y=sn(0.5,-1) 
print y 

y1=y.real 
print y1, np.arcsin(y), np.arcsin(y1) 

Ich bekomme den Fehler, auch wenn ich nur den reellen Teil der Funktion sn(0.5,-1) übergeben. Ich weiß nicht, ob ich einen Fehler mache. Freundlich helfen. Vielen Dank im Voraus.

+0

Ich brauche andere Pakete für Rest meines Programms. Also importiere ich sie. – user43280

Antwort

3

y ist ein mpc Objekt und y.real ist ein mpf Objekt. numpy weiß nichts über solche Objekte. Wenn Sie also np.arcsin(y) aufrufen, prüft der numpy-Code, ob das Argument eine arcsin()-Methode hat (dh, es sucht nach y.arcsin()). Wenn dies der Fall ist, wird diese Funktion aufgerufen, um den arcsin zu berechnen. Die Objekte mpc und mpf haben keine solche Methode, die zu dem angezeigten Fehler führt. (Es wäre schön, wenn die Fehlermeldung, sagt etwas wie „numpy nicht weiß, wie die arcsin eines mpf Objekt zu berechnen“.)

Hier ist das gleiche Verhalten mit einem anderen Objekt demonstriert:

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' 

wie durch Hannebambel in einem Kommentar darauf hingewiesen, könnten Sie mpmath.asin statt np.arcsin verwenden:

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') 

die numpy arcsin Funktion nutzen zu können, zuerst, indem t zu einem einfachen Gleitkomma oder komplex umwandeln er mpc und mpf Gegenstände durch die eingebauten Funktionen complex() und float() jeweils:

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) 

Oder verwenden math.asin statt numpy.arcsin:

In [25]: import math 

In [26]: math.asin(y.real) 
Out[26]: 0.5200127360815863 
+0

Ich würde lieber 'mpmath.asin' verwenden, da dies erlaubt, innerhalb dieser willkürlichen Genauigkeitsbibliothek zu bleiben. Gibt ein mpmath.ctx_mp_python.mpf-Objekt zurück, kein Float wie 'math.asin'. – Hannebambel

+0

@Hannebambel Ja, das macht Sinn. Ich nahm an, dass Satadru einen Grund hat, 'np.arcsin' zu benutzen, aber vielleicht war es einfach ein Mangel an Bewusstsein für' mpmath.asin'. Ich habe meine Antwort aktualisiert. –

+0

Ja, ich wusste nicht über 'mpmath.asin'. Eigentlich bin ich sehr arm in Python. – user43280

Verwandte Themen