Создать 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
).
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
Конкретная причина ошибки вы это:
(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)