【问题标题】:Finding number of duplicates only and only at the end of a numpy array仅在 numpy 数组的末尾查找重复项的数量
【发布时间】:2020-09-30 08:56:14
【问题描述】:

我知道如何从 numpy 数组中找到重复项的数量。 但是,我需要仅在 numpy 数组 的末尾 找到重复项的数量。 请参阅下面的示例:

输入示例如下:

1995
1996
1996
1997
1998
1999
1999
1999

期望的输出:

3

提前致谢!

【问题讨论】:

    标签: python arrays numpy duplicates


    【解决方案1】:

    这是np.minimum.accumulate 的一种方式-

    np.minimum.accumulate(a[::-1]==a[-1]).sum()
    

    示例运行 -

    In [64]: a
    Out[64]: array([2, 1, 9, 0, 0, 0, 2, 1, 0, 0, 0, 0, 2, 1, 0, 9, 9, 9, 9, 9])
    
    In [73]: np.minimum.accumulate(a[::-1]==a[-1]).sum()
    Out[73]: 5
    

    另一个argmin -

    In [88]: (a[::-1]==a[-1]).argmin()
    Out[88]: 5
    

    对于极端情况,如果所有元素都相同,我们可能需要一个额外的步骤来检查 a[::-1]==a[-1] 上的 all 匹配并在这种情况下返回 len(a)。或者如果计数是0,不能作为输出,我们将输出len(a)

    【讨论】:

    • 嘿,为什么不像 np.sum( data == data[-1] ) 那样求和,np.minimum.accumulate 有什么特别的优势吗?
    • @PavanKumarPolavarapu 因为如果我正确理解 OP 的 only at the end of the numpy array 意图,我们想跳过与最后一个元素匹配的中间元素。
    • 嗯,有道理:)
    • @PavanKumarPolavarapu 非常感谢您的关注。 仅在 numpy 数组的末尾 是这个问题的关键。
    【解决方案2】:
    mylist = [1995,
    1996,
    1996,
    1997,
    1998,
    1999,
    1999,
    1999]
    s = 0
    x = mylist[-1]
    for i in mylist:
       if i == x: s+= 1
    print(s)
    

    【讨论】:

    • 谢谢。您的代码将返回正确的结果,但是当循环遇到非重复时应该会中断。
    【解决方案3】:

    我的解决方案如下,但是,我确信有一个更优雅的解决方案!

    def get_numlastdups(my_nparray):
        numlastdups=0
        for i in range(2,len(my_nparray)):
            if my_nparray[-1]==my_nparray[-i]: numlastdups+=1
            else: break 
        return numlastdups
    

    【讨论】:

    • 这不起作用 - 因为您不会在遇到非重复的 all 值时打破循环,等于最后一个值(不仅仅是连续的值)将被计算在内。
    • @Blotosmetek 实际上它会起作用,因为我只考虑 if 部分中的最后一个元素,但你对休息有一点看法。我添加了一个休息时间。
    猜你喜欢
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    • 2021-04-24
    • 2014-03-22
    • 2021-08-07
    • 2012-11-17
    • 1970-01-01
    • 2015-09-03
    相关资源
    最近更新 更多