【问题标题】:Finding a break in continuous indices in a numpy array在 numpy 数组中找到连续索引的中断
【发布时间】:2021-11-11 17:53:52
【问题描述】:

我有一个数组 A 的条件语句(假设它是 A>10),我得到以下布尔结果。

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

现在我正在查找值为 True 的索引。我得到以下数组。

array([20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
       37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 60, 61, 62, 63,
       64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
       81, 82, 83, 84, 85, 86, 87, 88, 89, 90])

我需要做的是找到连续索引的开始索引和结束索引。例如,在上面的数组中,第一个连续索引的开始索引是 20,结束索引是 49。同样,第二组连续索引的开始索引是 60,结束索引是 90。

总而言之,我的输出应该是:

start_indices = array([20,60])

end_indices = array([49,90])

如何做到这一点?

【问题讨论】:

    标签: python arrays numpy indexing numpy-ndarray


    【解决方案1】:

    这是使用来自itertoolsgroupbyaccumulate 的解决方案:

    from itertools import groupby, accumulate
    
    ## input array
    #a = array([False, False, ..., True, ..., False])
    
    indices = list(accumulate(len(list(g)) for i,g in groupby(a)))
    starts = indices[:len(indices)//2*2:2]
    stops = [i-1 for i in indices[1::2]]
    

    注意。它适用于任何可迭代的,不仅仅是 numpy 数组。

    输出:

    >>> starts
    [20, 60]
    >>> stops
    [49, 90]
    

    【讨论】:

    • 我想知道你在这里假设什么是“a”。
    • 对不起,a 是数组/可迭代
    【解决方案2】:
    import numpy as np
    
    # With A as the original array
    changes = np.where(np.diff(A > 10))[0] # Gets the actual array out of a tuple
    start = changes[::2] + 1
    end = changes[1::2]
    

    【讨论】:

    • 你认为这里的“A”是什么?真正的数组还是最终的“TRUE”索引?
    • 我编辑了我的答案以澄清我使用的 A
    猜你喜欢
    • 2021-06-29
    • 2020-04-13
    • 1970-01-01
    • 2014-09-13
    • 2021-08-12
    • 2017-06-02
    • 1970-01-01
    • 2018-11-19
    • 2011-11-13
    相关资源
    最近更新 更多