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



我有以下列表:

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

np.unique值为 [1, 2]

如何生成以下列表:

[1, 2, 1, 2, 3]

即列表x中的每个唯一元素从 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]

只需将np.unique return_counts=True与 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)

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

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()制作自己的计数器(

最新更新