例如,让我们考虑下面的NumPy数组:
[1, 5, 0, 5, 4, 6, 1, -1, 5, 10]
另外,让我们假设阈值等于3
。这就是说,我们正在寻找至少有两个连续的值都在阈值以上的序列。
输出将是这些值的索引**,在我们的示例中为:
[[3, 4, 5], [8, 9]]
如果输出数组是扁平化的,那也可以!
[3, 4, 5, 8, 9]
输出说明
在我们的初始数组中,我们可以看到,对于index = 1
,我们有一个值5
,它大于阈值,但不是每个值都大于阈值的序列(至少包含两个值)的一部分。这就是为什么这个指数不会出现在我们的产出中。
另一方面,对于索引[3, 4, 5]
,我们有一系列(至少两个)相邻值[5, 4, 6]
,其中每个值都高于阈值,这就是它们的索引包含在最终输出中的原因!
我的代码到目前为止
我对这个问题的看法是这样的:
(arr > 3).nonzero()
上面的命令收集阈值以上的所有项目的索引。然而,我不能确定它们是否是连续的。我曾想过对上述代码片段的结果尝试diff
,然后可能会定位其中的一个(也就是说,索引一个接一个)。这将给我们带来:
np.diff((arr > 3).nonzero())
但我还是会错过这里的一些东西。
8条答案
按热度按时间w6mmgewl1#
如果将一个布尔数组与一个大小为
win_size
([1] * win_size
)的充满1
的窗口进行卷积,则将获得一个值为win_size
的数组,其中win_size
项的条件成立:gcmastyq2#
您可以使用简单的NumPy操作来做您想做的事情
说明
数组
a
是原始数组的填充二进制版本,其中1
的原始元素大于3。da
包含1
,其中“岛”以a
开始,-1
,“岛”以a
结束。由于填充,保证在da
中有相同数量的1
和-1
。提取它们的指数,我们就可以计算出这些岛屿的长度。有效的索引对是那些各自“岛”的长度大于等于2的索引对。然后,只需生成有效“岛”的索引边界之间的所有数字即可。67up9zun3#
我遵循你最初的想法。你就快做完了。
我使用另一个
diff2
来选取序列中第一个值的索引。有关详细信息,请参见代码中的注解。pxy2qtax4#
我将使用窗口视图尝试一些不同的方法,我不确定这是否一直有效,因此欢迎使用反例。它的优点是不需要使用Python循环。
它是怎么工作的?
因此,我们从数组开始,收集达到阈值的索引:
然后,我们构建一个滑动窗口,该窗口沿该列由两个值组成(这就是该窗口的
(2, 1)
形状的原因)。现在我们想要取每一对内部的差异,如果它是一,那么指数是连续的。
我们可以将这些值插入到上面创建的窗口中,
然后我们可以拆分(如果可能的话,平坦化而不复制),我们必须消除窗口创建的重复索引,所以我调用
np.unique
。我们再一次拆分,得到:gev0vcfq5#
下面的迭代代码应该有助于降低
O(n)
的复杂性fslejnso6#
我建议使用带有两个索引的for循环。您将有一个从j=1开始的索引,另一个从i=0开始的索引,两者都前进1。然后,您可以询问这两个值是否都大于阈值,如果是,则将索引添加到列表中,并继续向前移动j,直到阈值或.Next()不大于阈值。
这很管用。但需要重构
dtcbnfnu7#
让我们试一试以下代码:
输出:
ejk8hzay8#
这里有一个利用Pandas
Series
的解决方案:我们现在可以轻松地在一维数组中获取它们的索引:
或多个列表: