列表中唯一元素的索引值数组

时间:2019-07-16 10:39:57

标签: python numpy indexing unique

我有以下列表:

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

具有np.unique的{​​{1}}值

如何生成以下列表:

[1, 2]

即列表[1, 2, 1, 2, 3] 中每个唯一元素从1开始的运行索引。

3 个答案:

答案 0 :(得分:2)

按值本身分组后,您可以使用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]

答案 1 :(得分:2)

只需将return_counts=True中的np.unique与listcomp和np.hstack一起使用。这仍然是更快的熊猫解决方案

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)

答案 2 :(得分:1)

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

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()自己创建计数器)