查找数组中重复元素的索引(Python,NumPy)

发布于 2021-01-29 14:58:14

假设我有一个整数的NumPy数组,如下所示:

[34,2,3,22,22,22,22,22,22,18,90,5,-55,-19,22,6,6,6,6,6,6,6,6,23,53,1,5,-42,82]

我想找到数组的开始和结束索引,其中值的值大于重复的x倍(例如5倍)。因此,在上述情况下,其值为22和6。重复的22的开始索引为3,结束的索引为8。重复6相同。Python中是否有特殊的工具对您有所帮助?否则,我将遍历数组索引以获取索引,并将实际值与前一个进行比较。

问候。

关注者
0
被浏览
117
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    使用@WarrenWeckesser在此处np.diff给出的和方法来查找数组中的零游程:

    import numpy as np
    
    def zero_runs(a):  # from link
        iszero = np.concatenate(([0], np.equal(a, 0).view(np.int8), [0]))
        absdiff = np.abs(np.diff(iszero))
        ranges = np.where(absdiff == 1)[0].reshape(-1, 2)
        return ranges
    
    a = [34,2,3,22,22,22,22,22,22,18,90,5,-55,-19,22,6,6,6,6,6,6,6,6,23,53,1,5,-42,82]
    
    zero_runs(np.diff(a))
    Out[87]: 
    array([[ 3,  8],
           [15, 22]], dtype=int32)
    

    然后可以根据运行开始和结束之间的差异来过滤:

    runs = zero_runs(np.diff(a))
    
    runs[runs[:, 1]-runs[:, 0]>5]  # runs of 7 or more, to illustrate filter
    Out[96]: array([[15, 22]], dtype=int32)
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看