【问题标题】:Array of index values for unique elements in list列表中唯一元素的索引值数组
【发布时间】:2019-07-16 10:39:57
【问题描述】:

我有以下清单:

x = np.array([1, 1, 2, 2, 2])

np.unique 的值为[1, 2]

如何生成以下列表:

[1, 2, 1, 2, 3]

即列表 x 中每个唯一元素的从 1 开始的运行索引。

【问题讨论】:

    标签: python numpy indexing unique


    【解决方案1】:

    您可以在按值本身分组后使用pandas.cumcount(),它就是这样做的:

    将每个组中的每个项目编号从 0 到该组的长度 - 1。

    试试这个:

    import numpy as np
    import pandas as pd
    
    x = np.array([1, 1, 2, 2, 2])
    
    places = list(pd.Series(x).groupby(by=x).cumcount().values + 1)
    print(places)
    

    输出:

    [1, 2, 1, 2, 3]
    

    【讨论】:

    • 谢谢。有没有办法在没有熊猫的情况下做到这一点?
    • @alex_lewis 我尝试使用本机 numpy 函数,但找不到任何好的解决方案。我想到的另一种方法是在循环中使用list.index,这会慢100倍:(也许其他人只会想出一些numpy的东西。
    【解决方案2】:

    只需将return_counts=Truenp.unique 与listcomp 和np.hstack 一起使用。它仍然是更快的 pandas 解决方案

    c = np.unique(x, return_counts=True)[1]
    np.hstack([np.arange(item)+1 for item in c])
    
    Out[869]: array([1, 2, 1, 2, 3], dtype=int64)
    

    【讨论】:

    • 这仅在值是连续的情况下才有效。对于x = np.array([1, 1, 2, 2, 2, 1]),你会得到[1 2 3 1 2 3],而你应该得到[1 2 1 2 3 3]
    【解决方案3】:

    我不确定,如果这是更快或更慢的解决方案,但如果你只需要一个没有熊猫的列表结果,你可以试试这个

    arr = np.array([1, 1, 2, 2, 2])
    from collections import Counter
    ranges = [range(1,v+1) for k,v in Counter(arr).items()]
    result = []
    for l in ranges:
        result.extend(list(l))
    print(result)
    

    [1, 2, 1, 2, 3]

    (或使用dict 而不是Counter() 制作自己的计数器)

    【讨论】:

      猜你喜欢
      • 2019-09-19
      • 1970-01-01
      • 2014-06-09
      • 1970-01-01
      • 2019-06-26
      • 2011-10-08
      • 1970-01-01
      • 2020-12-15
      相关资源
      最近更新 更多