gpt4 book ai didi

python - 掩码数组中的 Numpy 梯度

转载 作者:行者123 更新时间:2023-12-01 09:29:28 30 4
gpt4 key购买 nike

当我在 numpy 中计算屏蔽数组的梯度时

import numpy as np
import numpy.ma as ma
x = np.array([100, 2, 3, 5, 5, 5, 10, 100])
mx = ma.masked_array(x, mask=[1, 0, 0, 0, 0, 0, 0, 1])

结果数组的掩码与原始掩码不同:

np.gradient(mx) 
masked_array(data = [-- -- 1.5 1.0 0.0 2.5 -- --],
mask = [ True True False False False False True True],
fill_value = 999999)

为什么不在"new"边界计算梯度?我怎样才能改变它?

对于中间的屏蔽条目,它会变得更奇怪:

x = np.array([100, 2, 3, 5, 5, 6, 6, 6, 6, 6, 7, 5, 10, 100])
mx = ma.masked_array(x, mask=[1, 0, 0, 0,0, 0,1,0,0,0, 0, 0, 0, 1])
np.gradient(mx)
masked_array(data = [-- -- 1.5 1.0 0.5 -- 0.0 -- 0.0 0.5 -0.5 1.5 ----],
mask = [ True True False False False True False True False False False False
True True],
fill_value = 1e+20)

我希望np.gradient将 mask 单元视为边界。

更新:

我想做的事:我需要计算数组上的梯度,而不改变掩码,也不改变数组的形状(我最后想要 2d)被掩码的单元不应该对梯度产生影响。屏蔽单元旁边的点应被视为边界并应用单侧差异。

- - - - - - - - - - -
- - - - o o - - o - -
- - - o x x o o x o -
- - - o x o - - o - -
- - - - o - - - - - -
- - - - - - - - - - -

在此草图中,x 表示屏蔽单元,o 是应计算单侧差异的单元(区域边缘的单元需要为 1)也是双面的,但为了清楚起见,我没有在这里画它们)。

最佳答案

我认为原因是您期望 mx 的屏蔽元素在梯度计算过程中要跳过的数组,以便代替在 x = np.array([100, 2, 3, 5, 5, 5, 10, 100]) 上计算梯度我们将在 x = np.array([2, 3, 5, 5, 5, 10]) 上计算它,但实际行为在某种程度上有所不同 np.ma.MaskedArray继承自 np.ndarraynp.gradient()没有对 np.ndarray 做任何特别的事情或其子类。所以,在 mx = ma.masked_array(x, mask=[1, 0, 0, 0, 0, 0, 0, 1]) 的情况下,梯度将在数组上计算:

[--, 2, 3, 5, 5, 5, 10, --]

首先,它将尝试计算第一个元素的梯度,默认情况下一阶差分和步长 h=1 (np.gradient 默认情况下将输入的每个维度中的步骤视为一元。):

gradient[0] = (mx[1] - mx[0]) / h

因为,它取决于mx[0] mask 不允许使用,gradient[0]的值将被“True”屏蔽。

当它尝试计算您视为数组新左边界的元素的索引 1 处的梯度时;该元素实际上不是 ndarray 的边界元素。当它计算您认为是新左边界的元素的梯度时,它实际上会使用具有齐次步长的中心差分公式 h , gradient[1] = (mx[2] - mx[0]) / 2h ,但是因为mx[0]被屏蔽为无法使用的值,值为 gradient[1]也无法检索,因此它被掩盖为 True 。同样的情况也发生在数组的另一端。

现在关于掩盖中间的某些内容,假设:

x = np.array([1, 2, 3, 4, 5])
mask = [0, 0, 1, 0, 0]
mx = ma.masked_array(x, mask=mask)

再次应用于 mx 的梯度函数将使用齐次步骤的中心差分公式,并且当我们计算时:

masked_gradient[1] = (mx[2] - mx[0]) / 2h
masked_gradient[3] = (mx[4] - mx[2]) / 2h

这两个值都无法计算,因为 mx[2] 被 True 屏蔽。 。同时:

masked_gradient[2] = (mx[3] - mx[1]) / 2h

可以评估,因为它所依赖的所有值都被屏蔽为 False ,所以结果会有一个掩码:

[0, 1, 0, 1, 0]

和值(value)观:

[1.0, --, 1.0, --, 1.0]

关于python - 掩码数组中的 Numpy 梯度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50087413/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com