【问题标题】:Central difference with Convolution与卷积的中心差异
【发布时间】:2020-08-12 19:14:30
【问题描述】:

所以基本上我试图在二维数组上进行有限差分,而不做太多的 for 循环。我想要数组的 Hessian 矩阵和梯度。所以我需要数组的一阶和二阶导数。

这可以通过在数组上评估以下等式来实现。

为了处理边界,我们只计算内部点,所以这个导数的代码可能如下所示

arr = np.random.rand(16).reshape(4,4)
result = np.zeros_like(arr)
w, h = arr.shape
for i in range(1, w-1):
    for j in range(1, h-1):
        result[i,j] = (arr[i+1, j] - arr[i-1, j]) / (2*dx)

这给出了正确的答案,但与 nu numpy 操作相比可能会非常慢,所以我心想。这基本上只是一个看起来像这样的内核的卷积

kernel = [1, 0 , -1]

所以我们执行下面的代码

from scipy.sigmal import convolve
result = np.pad((convolve(arr,kernel,mode='same', 
             method = 'direct')/(2*dx))[1:-1, 1:-1], 1).T

由于我们只处理内部点,因此我们将它们切掉并在之后用零填充,以模仿在之前的幼稚情况下会发生的情况。

这行得通!但是对于某些数组,朴素情况和卷积情况天空火箭之间的均方误差。因此,在某些情况下,数值误差似乎会增加很多。

我希望通过卷积获得的速度与幼稚案例的稳定性。有什么帮助吗?

【问题讨论】:

    标签: python python-3.x numpy vectorization


    【解决方案1】:

    我们可以简单地切片和操作。因此,在输出初始化之后,做 -

    result[1:-1,1:-1] = (arr[2:,1:-1] - arr[:-2,1:-1])/(2*dx)
    

    恕我直言,在使用 NumPy 数组时,卷积将是一种过度杀伤力,因为切片数组在内存和性能上几乎是免费的。由于计算量很大,可以查看numexpr 以利用多核。

    【讨论】:

    • 再次感谢@Divakar 的简单回答,我把它复杂化了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    • 2022-10-02
    • 2013-12-17
    相关资源
    最近更新 更多