当我计算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
是应该计算单侧差异的细胞(该区域边缘的细胞也需要是单侧的,但我为了清楚起见,请不要在这里画画。
答案 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.MaskedArray
从np.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=1
(np.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]) / 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)
掩盖。同样发生在数组的另一端。
现在关于屏蔽中间的东西,假设:
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在数组末尾有单侧差异,但蒙面数组的孔不算作结束。
你的第二个例子显示了模板上的洞:你可以计算 数据中的一个孤立的洞。