计算2d网格的“向内导数”

时间:2018-01-06 16:12:52

标签: python numpy

我将在2d中暴露问题,但最终需要在3维中解决它。

假设我有以下网格

import numpy as np
ge = np.arange(36).reshape((6, 6))
gu = ge + 10
f = ge - 2*gu**2

现在f看起来像这样:

array([[ -200,  -241,  -286,  -335,  -388,  -445],
       [ -506,  -571,  -640,  -713,  -790,  -871],
       [ -956, -1045, -1138, -1235, -1336, -1441],
       [-1550, -1663, -1780, -1901, -2026, -2155],
       [-2288, -2425, -2566, -2711, -2860, -3013],
       [-3170, -3331, -3496, -3665, -3838, -4015]])

我可以将外部网格点设为via this answer

def edge_mask(x):
    mask = np.ones(x.shape, dtype=bool)
    mask[x.ndim * (slice(1, -1),)] = False
    return mask
edge_mask(f)
Out[56]: 
array([[ True,  True,  True,  True,  True,  True],
       [ True, False, False, False, False,  True],
       [ True, False, False, False, False,  True],
       [ True, False, False, False, False,  True],
       [ True, False, False, False, False,  True],
       [ True,  True,  True,  True,  True,  True]], dtype=bool)

现在,对于所有这些边界点,我想计算“向内衍生物”。目前,我们可以假设eu上所有网格点之间的空格为1。然后,f[0, 1]的网格向内导数可以计算为

(-571-(-241))/(1) = -330

对于角点[0, 0],向内导数是w.r.t.对角元素[1,1],我们可以在这里计算它

(-571 - (-200)/1 =  371

对于[4, 5],我们有(-2860-(-3838))/1 = 987

我面临的主要问题是计算不同方向的导数,总是向内。否则,这只是np.diff()的情况。什么是一种有效的方法来实现至少3个维度呢?

1 个答案:

答案 0 :(得分:0)

使用蒂尔霍夫曼的好评,我至少可以在那里得到。

使用二进制矩阵时,

gradient得到了符号错误,但是我们得到了整数

mask = edge_mask(f)
a, b = np.gradient(mask.astype(int))

给出了(反)符号(衍生物是否需要向内或向外计算):

a
Out[90]: 
array([[ 0. , -1. , -1. , -1. , -1. ,  0. ],
       [ 0. , -0.5, -0.5, -0.5, -0.5,  0. ],
       [ 0. ,  0. ,  0. ,  0. ,  0. ,  0. ],
       [ 0. ,  0. ,  0. ,  0. ,  0. ,  0. ],
       [ 0. ,  0.5,  0.5,  0.5,  0.5,  0. ],
       [ 0. ,  1. ,  1. ,  1. ,  1. ,  0. ]])
b
Out[91]: 
array([[ 0. ,  0. ,  0. ,  0. ,  0. ,  0. ],
       [-1. , -0.5,  0. ,  0. ,  0.5,  1. ],
       [-1. , -0.5,  0. ,  0. ,  0.5,  1. ],
       [-1. , -0.5,  0. ,  0. ,  0.5,  1. ],
       [-1. , -0.5,  0. ,  0. ,  0.5,  1. ],
       [ 0. ,  0. ,  0. ,  0. ,  0. ,  0. ]])

那么,我们可以做到

-a * mask * np.gradient(f)[0]
Out[88]: 
array([[   0., -330., -354., -378., -402.,    0.],
       [   0.,   -0.,   -0.,   -0.,   -0.,    0.],
       [   0.,    0.,    0.,    0.,    0.,    0.],
       [   0.,    0.,    0.,    0.,    0.,    0.],
       [   0.,    0.,    0.,    0.,    0.,    0.],
       [   0.,  906.,  930.,  954.,  978.,    0.]])
-b * mask * np.gradient(f)[1]
Out[89]: 
array([[   0.,    0.,    0.,    0.,    0.,    0.],
       [ -65.,   -0.,    0.,    0.,    0.,   81.],
       [ -89.,   -0.,    0.,    0.,    0.,  105.],
       [-113.,   -0.,    0.,    0.,    0.,  129.],
       [-137.,   -0.,    0.,    0.,    0.,  153.],
       [   0.,    0.,    0.,    0.,    0.,    0.]])

现在缺少的只是角落 - 我有点被困在这里。