Создать mpf из массива

Я пытаюсь использовать fsolve в сочетании с пакетом mpmath. Однако я получаю сообщение об ошибке cannot create mpf from array([mpf('1.0')], dtype=object).

Вот минимальный пример, воспроизводящий ошибку. Для этого примера мне технически не нужен пакет 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 (Как mpf массив?), но он говорит мне, что функция не вызывается (когда я применяю ее к vn).


person Nigu    schedule 05.04.2016    source источник


Ответы (2)


Хитрость заключается в том, чтобы применить 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
person Xiao    schedule 20.05.2016

Конкретная причина ошибки заключается в следующем:

(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)
person ev-br    schedule 06.04.2016
comment
Привет. Я быстро попробовал ваше определение функции, но оно все еще не работает. Сейчас я очень занят другим проектом, но скоро вернусь к этому и буду держать вас в курсе. Спасибо. - person Nigu; 07.04.2016