我将在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)
现在,对于所有这些边界点,我想计算“向内衍生物”。目前,我们可以假设e
和u
上所有网格点之间的空格为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个维度呢?
答案 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.]])
现在缺少的只是角落 - 我有点被困在这里。