从数组创建 mpf
Create mpf from array
我正在尝试将 fsolve
与 mpmath
包结合使用。
但是,我收到错误 cannot create mpf from array([mpf('1.0')], dtype=object)
.
这是一个重现错误的最小示例。对于这个例子,我在技术上不需要 mpmath
包,但我的实际函数包含需要的 hyperconfluent 函数。
from scipy.optimize import fsolve
#from mpmath import hyp1f1 as hyp1f1mp
#from mpmath import gamma as gammamp
import mpmath as mp
#import numpy as np
mp.dps = 250; mp.pretty = True
def cosFunc(p):
vn = p
output = mp.sin(vn)
return output
estimate = mp.mpf(1)
value = fsolve(cosFunc,estimate)
print value
我发现了一个类似的问题,建议使用 np.frompyfunc
(How to mpf an array?),但它告诉我该函数不可调用(当我在 vn
上应用它时)。
你这个错误的具体原因是这样的:
(Pdb) x0
array([mpf('1.0')], dtype=object)
(Pdb) mp.sin(x0)
*** TypeError: cannot create mpf from array([mpf('1.0')], dtype=object)
发生的事情是 fsolve
试图将您的 estimate
转换为数组,而 numpy 不知道如何处理 mpmath 对象。
>>> np.asarray(mp.mpf(1))
>>> array(mpf('1.0'), dtype=object)
改变 fsolve
的工作方式不是很有效,所以最好的办法似乎是教你的函数处理 mpmath 对象数组
def cos_func(p):
vn = p
if isinstance(p, np.ndarray):
if p.size == 0:
vn = p[0]
else:
raise ValueError # or whatever you want to do here"
return mp.sin(vn)
诀窍是将 np.frompyfunc
应用于函数而不是值。我认为以下修改将使您的功能正常工作:
def cosFunc(p):
vn = p
np_sin = np.frompyfunc(mp.sin, 1, 1)
output = np_sin(vn)
return float(output)
value = fsolve(cosFunc, 1)
print value
我正在尝试将 fsolve
与 mpmath
包结合使用。
但是,我收到错误 cannot create mpf from array([mpf('1.0')], dtype=object)
.
这是一个重现错误的最小示例。对于这个例子,我在技术上不需要 mpmath
包,但我的实际函数包含需要的 hyperconfluent 函数。
from scipy.optimize import fsolve
#from mpmath import hyp1f1 as hyp1f1mp
#from mpmath import gamma as gammamp
import mpmath as mp
#import numpy as np
mp.dps = 250; mp.pretty = True
def cosFunc(p):
vn = p
output = mp.sin(vn)
return output
estimate = mp.mpf(1)
value = fsolve(cosFunc,estimate)
print value
我发现了一个类似的问题,建议使用 np.frompyfunc
(How to mpf an array?),但它告诉我该函数不可调用(当我在 vn
上应用它时)。
你这个错误的具体原因是这样的:
(Pdb) x0
array([mpf('1.0')], dtype=object)
(Pdb) mp.sin(x0)
*** TypeError: cannot create mpf from array([mpf('1.0')], dtype=object)
发生的事情是 fsolve
试图将您的 estimate
转换为数组,而 numpy 不知道如何处理 mpmath 对象。
>>> np.asarray(mp.mpf(1))
>>> array(mpf('1.0'), dtype=object)
改变 fsolve
的工作方式不是很有效,所以最好的办法似乎是教你的函数处理 mpmath 对象数组
def cos_func(p):
vn = p
if isinstance(p, np.ndarray):
if p.size == 0:
vn = p[0]
else:
raise ValueError # or whatever you want to do here"
return mp.sin(vn)
诀窍是将 np.frompyfunc
应用于函数而不是值。我认为以下修改将使您的功能正常工作:
def cosFunc(p):
vn = p
np_sin = np.frompyfunc(mp.sin, 1, 1)
output = np_sin(vn)
return float(output)
value = fsolve(cosFunc, 1)
print value