Python 从阵列创建mpf

Python 从阵列创建mpf,python,numpy,scipy,mpmath,Python,Numpy,Scipy,Mpmath,我正在尝试将fsolve与mpmath软件包结合使用。 但是,我得到一个错误:无法从数组[mpf'1.0'],dtype=object创建mpf 下面是一个再现错误的最小示例。对于这个例子,我在技术上不需要mpmath包,但是我的实际函数包含了超连续函数,可以 from scipy.optimize import fsolve #from mpmath import hyp1f1 as hyp1f1mp #from mpmath import gamma as gammamp import mp

我正在尝试将fsolve与mpmath软件包结合使用。 但是,我得到一个错误:无法从数组[mpf'1.0'],dtype=object创建mpf

下面是一个再现错误的最小示例。对于这个例子,我在技术上不需要mpmath包,但是我的实际函数包含了超连续函数,可以

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,但它告诉我,当我在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试图将估计值转换为数组,而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)

导致错误的具体原因如下:

(Pdb) x0
array([mpf('1.0')], dtype=object)
(Pdb) mp.sin(x0)
*** TypeError: cannot create mpf from array([mpf('1.0')], dtype=object)
发生的情况是,fsolve试图将估计值转换为数组,而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
诀窍是将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

你好我很快尝试了你的函数定义,但它仍然不起作用。我现在正忙于另一个项目,但我很快会回来和你保持联系。谢谢,你好。我很快尝试了你的函数定义,但它仍然不起作用。我现在正忙于另一个项目,但我很快会回来和你保持联系。谢谢