Python: AttributeError: 'mpc' (or 'mpf') object has no attribute 'arcsin'

Python: AttributeError: 'mpc' (or 'mpf') object has no attribute 'arcsin'

我试图使用 mpmath 中的 Jacobi 椭圆函数,但收到下面给出的简单代码的错误:

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)

即使我只传递了函数的实部 sn(0.5,-1),我仍然收到错误消息。 我不知道我是否犯了错误。请帮忙。 提前致谢。

y 是一个 mpc 对象,y.real 是一个 mpf 对象。 numpy 对此类对象一无所知,因此当您调用 np.arcsin(y) 时,numpy 代码会检查参数是否具有 arcsin() 方法(即,它会查找 y.arcsin())。如果是,它将调用该函数来计算 arcsin。 mpcmpf 对象没有这样的方法,这会导致您看到的错误。 (如果错误信息说的是 "numpy does not know how to compute the arcsin of an mpf object" 之类的话就好了。)

下面是用不同对象演示的相同行为:

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'

正如 Hannebambel 在评论中指出的那样,您可以使用 mpmath.asin 而不是 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')

要使用 numpy arcsin 函数,首先将 mpcmpf 对象通过内置函数 complex()float(),分别为:

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)

或使用math.asin代替numpy.arcsin

In [25]: import math

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