虽然使用屏蔽数组可能不是most在这种情况下是有效的解决方案,它将允许您在特定轴上执行屏蔽操作,同时或多或少保留形状,这是一个很大的便利。请记住,在许多情况下,屏蔽函数最终仍会复制屏蔽数据。
您当前的代码中的想法基本上是正确的,但是您错过了一些技巧,例如能够否定和组合掩码。此外,预先将掩码分配为布尔值的事实更有效,并且像这样的小挑剔np.full(..., 0) -> np.zeros(..., dtype=bool)
.
让我们倒过来解决这个问题。假设您有一个表现良好且具有峰值的一维数组a1
。您可以使用掩蔽轻松找到最大值和最小值(或索引),如下所示:
peak_index = np.nanargmax(a1)
mask = np.zeros(a1.size, dtype=np.bool)
mask[peak:] = True
trough_plus = np.nanargmin(np.ma.array(a1, mask=~mask))
trough_minus = np.nanargmin(np.ma.array(a1, mask=mask))
这尊重了这样一个事实:掩码数组相对于正常的 numpy 布尔索引翻转了掩码的含义。计算中出现最大值也是可以的trough_plus
,因为它保证不是最小值(除非你有全南的情况)。
Now if a1
已经是一个蒙版数组(但仍然是一维),您可以做同样的事情,但暂时组合蒙版。例如:
a1 = np.ma.array(a1, mask=np.isnan(a1))
peak_index = a1.argmax()
mask = np.zeros(a1.size, dtype=np.bool)
mask[peak:] = True
trough_plus = np.ma.masked_array(a1, mask=a.mask | ~mask).argmin()
trough_minus (np.ma.masked_array(a1, mask=a.mask | mask).argmin()
同样,由于掩码数组具有反向掩码,因此使用以下方法组合掩码非常重要|
代替&
,就像普通的 numpy 布尔掩码一样。在这种情况下,不需要调用 nan 版本argmax
and argmin
,因为所有的 nan 都已经被屏蔽了。
希望从这里可以清楚地看出对多个维度的概括,因为axis
numpy 函数中的关键字:
a = np.ma.array(a, mask=np.isnan(a))
peak_indices = a.argmax(axis=0).reshape(1, *a.shape[1:])
mask = np.arange(a.shape[0]).reshape(-1, *(1,) * (a.ndim - 1)) >= peak_indices
trough_plus = np.ma.masked_array(a, mask=~mask | a.mask).argmin(axis=0)
trough_minus = np.ma.masked_array(a, mask=mask | a.mask).argmin(axis=0)
N维掩蔽技术来自根据起始索引有效填充掩码 https://stackoverflow.com/q/58595650/2988730,就是为了这个目的而提出的。