掩模数组中的Numpy渐变

时间:2018-04-29 14:02:05

标签: python numpy

当我计算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能够将屏蔽的单元格视为边界。

更新

我想做什么: 我需要计算数组上的渐变而不是更改掩码,也不需要更改数组的形状(我最后想要2d)蒙板单元格不应该对渐变有贡献。隐藏单元格旁边的点应视为边界,并应用单侧差异。

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

在此草图中x代表一个蒙面细胞,o是应该计算单侧差异的细胞(该区域边缘的细胞也需要是单侧的,但我为了清楚起见,请不要在这里画画。

2 个答案:

答案 0 :(得分:1)

我认为原因是你希望在计算渐变期间跳过mx数组的遮罩元素,这样我们就不会在x = np.array([100, 2, 3, 5, 5, 5, 10, 100])上计算渐变,而是在x = np.array([2, 3, 5, 5, 5, 10])上计算它。 1}},但真实行为的不同之处在于np.ma.MaskedArraynp.ndarray继承,而np.gradient()并未对np.ndarray或其子类做任何特殊处理。因此,在mx = ma.masked_array(x, mask=[1, 0, 0, 0, 0, 0, 0, 1])的情况下,将在数组上计算渐变:

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

首先,它会尝试计算第一个元素的渐变,默认情况下是第一个顺序差异,步骤h=1np.gradient默认情况下将步骤视为输入的每个维度中的一元。):< / p>

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

因为,它取决于mx[0] mask不允许使用的gradient[0]ndarray的值将被&#39; True`屏蔽。

当它尝试计算索引1处的渐变时,您认为该元素是数组的新左边界;该元素实际上不是h的边界元素。 当它计算您认为是新左边界的元素的渐变时,它实际上将使用中心差异公式与均匀步骤gradient[1] = (mx[2] - mx[0]) / 2hmx[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) 掩盖。同样发生在数组的另一端。

现在关于屏蔽中间的东西,假设:

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

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

True

这两个值都不能计算,因为mx [2]被masked_gradient[2] = (mx[3] - mx[1]) / 2h 掩盖了。并在同一时间:

False

可以进行评估,因为它所依赖的所有值都被屏蔽为[0, 1, 0, 1, 0] ,因此结果将有一个掩码:

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

价值观:

npm start

答案 1 :(得分:0)

它正在计算central difference,它不能在边界(或缺失值)附近构建。 numpy.gradient switches在数组末尾有单侧差异,但蒙面数组的孔不算作结束。

你的第二个例子显示了模板上的洞:你可以计算 数据中的一个孤立的洞。