Python中的偏导数

Python中的偏导数,python,numpy,derivative,Python,Numpy,Derivative,我正在慢慢地从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+

我正在慢慢地从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;
def dz(x,x,Y,Z,dx):
y=numpy.zero((X,y,Z),dtype='double');
代码=”“
int i,j,k;

对于(i=0;i如果您使用的是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
这可能是最惯用的numpy方法:

y = np.empty_like(x)
y[:-1] = np.diff(x, axis=0) / dx
y[-1] = -x[-1] / dx
您可能还对该函数感兴趣,尽管该函数在输入数组的所有维度上采用梯度,而不是单个维度。

现在还支持沿单个方向计算导数

a=np.array([[1,2,3],[2,3,5])
np.梯度(a,轴=0)
它沿轴
0
给出一个偏导数:

array([[1., 1., 2.],
       [1., 1., 2.]])

参数
axis
指定了一组求导函数的方向。

如果您只是编写C并让Python执行它(效率低下),为什么还要费心从C转到Python?如果您处理的是PDE,FEniCS()对你来说可能很有趣,
X
Y
Z
的意思是什么?X
的形状就是这样:我想转向纯Python,诀窍是,我目前的实现速度是我能做到的最快的,尽管我确信存在一个纯numpy的解决方案。尽管,你是对的:用我目前的解决方案,我的用Python是没有意义的。是的,只是维度。
array([[1., 1., 2.],
       [1., 1., 2.]])