我有一个大的三维(时间,经度,纬度)输入数组。大多数条目都被屏蔽了。我需要找到那些掩码为False的条目,其时间超过了特定的连续时间步数(这里我称之为threshold
)。结果应该是一个与输入掩码形状相同的掩码。
下面是一些伪代码,希望能更清楚地说明我的意思:
new_mask = find_consecutive(mask, threshold=3)
mask[:, i_lon, i_lat]
# [1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0]
new_mask[:, i_lon, i_lat]
# [1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1]
编辑:
我不确定到目前为止我的方法是否有意义。它在性能方面做得很好,给了我一个标签数组和我想要的标签的知识。我只是想不出一个有效的方法把labels
再转换成一个掩码。
为了完整起见,这里还有我在编辑中概述的方法的解决方案。在性能方面,它确实比两个Divakars解决方案差得多(与numpy_binary_closing相比大约是10倍),但允许处理3D数组。此外,它还提供了写出集群位置的可能性(这不是问题的一部分,但它可以是有趣的信息)
这是^{} 的一个经典例子。要解决这个问题,您可以从scipy模块获得帮助,特别是-^{} ,在我们提供了一个适当的1D内核,该内核的长度为
ONES
,长度为threshold
。{Scipy>也只给出了Scipy}函数。因此,为了得到所需的输出,我们需要使用输入掩码OR
。因此,实现将如下所示-一个新版本的二进制关闭怎么样!
现在,一个结束操作基本上是^{} and ^{} ,所以我们可以用可信卷积操作来模拟这种行为,在NumPy中我们有^{} 。与scipy的二进制关闭操作类似,我们在这里也需要相同的内核,我们将使用它来进行膨胀和腐蚀。实施将是-
^{pr2}$样本运行-
运行时测试(Scipy vs Numpy!)
情形1:一致稀疏
案例二:稀疏度越高阈值越大
胜利者是
Numpy
,而且差距很大!在似乎边界也需要关闭,如果
1s
离花盆足够近。要解决这些情况,可以在输入布尔数组的开头和结尾各填充一个1
,使用发布的代码,然后在末尾取消选择第一个和最后一个元素。因此,使用scipy的二进制关闭方法的完整实现将是-样本运行-
相关问题 更多 >
编程相关推荐