Допустим, у меня есть следующий 3d-Numpy-массив A:
array([[[ 1, 2, 3],
[ 1, 4, 9]],
[[ 1, 8, 27],
[ 1, 16, 81]]])
Я хочу интерполировать данные, используя interp1d
с axis=2
, т.е. интерполировать значения функции 1,2,3
, 1,4,9
, 1,8,27
и 1,16,81
одновременно с x=np.array([1,2,3])
(значения представляют f (x) = x, x ^ 2, x ^ 3 и x ^ 4 соответственно).
К счастью, этовозможно, так как interp1d может принимать ND-массивы в качестве второго аргумента, если ось интерполяции равна длине x:
f = interp1d(x,A,kind='linear',axis=2,fill_value='extrapolate')
Пока это работает довольно хорошо, f (1)производит
array([[1., 1.],
[1., 1.]]),
f (2) производит
array([[ 2., 4.],
[ 8., 16.]])
и интерполяция f (1.5) производит
array([[1.5, 2.5],
[4.5, 8.5]])
т.е. я получаю массив интерполяционных функций 2x2f (x), оцененное в x.
Теперь возникает проблема: я хочу инвертировать эти функции интерполяции, чтобы получить x для конкретного значения функции - поэлементно для каждой записи массива 2x2.
При работе с 1D-функцией g это обычно делается путем нахождения корня функции интерполяции минус запрошенное значение функции, скажем a:
g_subtracted = lambda x: f(x) - a
и нахождения нуля, дляПример использования scipy.optimize.newton:
optimize.newton(g_subtracted,1.0)
, где 1.0 - начальное предположение.
Вот мой актуальный вопрос: как мне найти ноль моего массива функций 2x2 interp2d для элемента f? Когда я просто делаю
f_subtracted = lambda x: f(x) - a
(это работаетхорошо для моего массива функций), а затем
optimize.newton(f_subtracted,1.0)
я получаю следующую ошибку:
File "<ipython-input-187-4cf34581a978>", line 1, in <module>
newton(f,1.0)
File "/anaconda3/lib/python3.6/site-packages/scipy/optimize/zeros.py", line 201, in newton
if q1 == q0:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Мне кажется, что optimize.newton не может работать с «массивами функций» каквход для оценки их поэлементно.Кто-нибудь знает способ, как это сделать?
Заранее большое спасибо!