Частичная производная в Python

Я медленно перехожу от C к Python. На этот раз мне нужно вычислить частные производные численно из заданной сетки. Я знаю, как это сделать на C, поэтому на данный момент я просто использую встроенный адаптер, т.е.

def dz(x,X,Y,Z,dx): y = numpy.zeros((X,Y,Z), dtype='double'); code = """ int i, j, k; for (i=0; i<X-1; i++){ for(k=0; k<Y; k++){ for (j=0; j<Z; j++){ y[i,k,j] = (x[i+1, k, j] - x[i, k, j])/dx; } } } for (j=0; j<Z; j++){ for(k=0; k<Y; k++){ y[X-1,k,j] = - x[X-1, k, j]/dx; } } """ weave.inline(code, ['x', 'y', 'dx', 'X', 'Y', 'Z'], \ type_converters=converters.blitz, compiler = 'gcc'); return y; 

где x и y представляют собой 3D-массивы numpy, как вы можете видеть, а второй цикл означает граничные условия. Конечно, я могу реализовать ту же логику в чистом Python, но код будет неэффективным. Интересно, однако, если можно вычислить частичную производную с использованием чистого numpy? Я был бы признателен за любую помощь, которую любой может предоставить.

np.diff может быть самым идиоматическим способом numpy:

 y = np.empty_like(x) y[:-1] = np.diff(x, axis=0) / dx y[-1] = -x[-1] / dx 

Вы также можете быть заинтересованы в np.gradient , хотя эта функция принимает градиент по всем размерам входного массива, а не по одному.

Если вы используете numpy, это должно сделать то же, что и ваш код выше:

 y = np.empty_like(x) y[:-1] = (x[1:] - x[:-1]) / dx y[-1] = -x[-1] / dx 

Чтобы получить тот же результат по второй оси, вы должны:

 y = np.empty_like(x) y[:, :-1] = (x[:, 1:] - x[:, :-1]) / dx y[:, -1] = -x[:, -1] / dx 
 def dz(x,dx): y = numpy.zeros(x.shape, dtype='double') y[:-1] = (x[1:] - x[:-1]) / dx y[-1] = -x[-1] / dx return y