我正在慢慢地从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;

其中xy是3d numpy数组,如您所见,第二个循环代表边界条件。当然,我可以用纯python实现相同的逻辑,但是代码效率会很低。不过,我想知道是否可以用纯numpy计算偏导数?我希望任何人能提供帮助。

最佳答案

np.diff可能是最惯用的方式:

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

您也可能对np.gradient感兴趣,尽管此函数在输入数组的所有维度上采用梯度,而不是单一的。

07-26 03:17