gpt4 book ai didi

python - numpy:检测数组中的连续 1

转载 作者:行者123 更新时间:2023-12-04 18:59:49 26 4
gpt4 key购买 nike

我想在一个 numpy 数组中检测连续的 1 跨度。实际上,我想首先确定数组中的元素是否在至少三个 1 的范围内。例如,我们有以下数组 a:

    import numpy as np
a = np.array([1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0])

那么下面加粗的1就是满足要求的元素。

[ 1, 1, 1 , 0, 1, 1, 1 , 0, 1, 1, 0, 0, 1, 1, 1 , 0, 0, 1, 1, 1, 1, 1 , 0]

接下来,如果两个 1 的跨度最多被两个 0 分隔,则这两个跨度构成一个更长的跨度。所以上面的数组被表征为

[ 1, 1, 1, 0, 1, 1, 1 , 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1 , 0]

换句话说,对于作为输入的原始数组,我希望输出如下:
    [True, True, True, True, True, True, True, False, False, False, False, False, True, True, True, True, True, True, True, True, True, True, False]

我一直在想一种算法来实现这个功能,但我想出的所有算法似乎都很复杂。所以我很想知道更好的方法来实现这个——如果有人能帮助我,我将不胜感激。

更新:

我很抱歉我没有把我的问题说清楚。我想将数组中的 3 个或更多连续 1 标识为 1 的跨度,并且将任何两个 1 跨度与中间只有一个或两个 0 的跨度以及分隔的 0 标识为单个长跨度。我的目标可以通过以下方式来理解:如果 1 的跨度之间只有一两个 0,我认为这些 0 是错误并应该被纠正为 1。

@ritesht93 提供的答案几乎给出了我想要的答案。但是,当前的答案没有确定存在三个由 0 分隔的 1 跨度的情况,应将其标识为单个跨度。例如,对于数组
    a2 = np.array([0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0])

我们应该收到输出
    [False,  True,  True,  True,  True,  True,  True,  True,  True,
True, True, True, True, True, False, False, False, False,
False, True, True, True, True, True, False]

更新 2:

我深受启发,发现基于正则表达式的算法最容易实现和理解——尽管与其他方法相比,我不确定其效率。最终我使用了以下方法。
    lst = np.array([0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0])
lst1 = re.sub(r'1{3,}', lambda x:'c'*len(x.group()), ''.join(map(str, lst)))
print lst1

它确定了 1 的跨度
    0ccc0ccc00cccc00100ccccc0

然后连接跨度为 1 的
    lst2 = re.sub(r'c{1}0{1,2}c{1}', lambda x:'c'*len(x.group()), ''.join(map(str, lst1)))
print lst2

这使
    0ccccccccccccc00100ccccc0

最终结果由下式给出
    np.array(list(lst2)) == 'c'

array([False, True, True, True, True, True, True, True, True,
True, True, True, True, True, False, False, False, False,
False, True, True, True, True, True, False])

最佳答案

我们可以使用 binary dilation erosion 的组合解决它以通过第一阶段,然后 binary closing 获得最终输出,就像这样 -

from scipy.ndimage.morphology import binary_erosion,binary_dilation,binary_closing

K = np.ones(3,dtype=int) # Kernel
b = binary_dilation(binary_erosion(a,K),K)
out = binary_closing(b,K) | b

示例运行

情况1 :
In [454]: a
Out[454]: array([1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0])

In [456]: out
Out[456]:
array([ True, True, True, True, True, True, True, False, False,
False, False, False, True, True, True, True, True, True,
True, True, True, True, False], dtype=bool)

案例#2:
In [460]: a
Out[460]:
array([0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0])

In [461]: out
Out[461]:
array([False, True, True, True, True, True, True, True, True,
True, True, True, True, True, False, False, False, False,
False, True, True, True, True, True, False], dtype=bool)

关于python - numpy:检测数组中的连续 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40338152/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com