scipy.misc.derivative для функции множественного аргумента

Прямо вычислить частные производные функции в точке относительно первого аргумента, используя функцию SciPy scipy.misc.derivative . Вот пример:

 def foo(x, y): return(x**2 + y**3) from scipy.misc import derivative derivative(foo, 1, dx = 1e-6, args = (3, )) 

Но как мне взять производную от функции foo по второму аргументу? Один из способов, который я могу представить, – создать функцию лямбда, которая решает аргументы вокруг, но это может быстро стать громоздким.

Кроме того, существует ли способ генерировать массив частных производных по некоторым или всем аргументам функции?

Я бы написал простую обертку, что-то вроде

 def partial_derivative(func, var=0, point=[]): args = point[:] def wraps(x): args[var] = x return func(*args) return derivative(wraps, point[var], dx = 1e-6) 

Демо-версия:

 >>> partial_derivative(foo, 0, [3,1]) 6.0000000008386678 >>> partial_derivative(foo, 1, [3,1]) 2.9999999995311555 

Да, это реализовано в sympy . Демо-версия:

 >>> from sympy import symbols, diff >>> x, y = symbols('x y', real=True) >>> diff( x**2 + y**3, y) 3*y**2 >>> diff( x**2 + y**3, y).subs({x:3, y:1}) 3 

Вот ответ для численного дифференцирования с помощью numdifftools.

 import numpy as np import numdifftools as nd def partial_function(f___,input,pos,value): tmp = input[pos] input[pos] = value ret = f___(*input) input[pos] = tmp return ret def partial_derivative(f,input): ret = np.empty(len(input)) for i in range(len(input)): fg = lambda x:partial_function(f,input,i,x) ret[i] = nd.Derivative(fg)(input[i]) return ret 

Затем:

 print (partial_derivative(lambda x,y: x*x*x+y*y,np.array([1.0,1.0]))) 

дает:

 [ 3. 2.]