我有以下列表:
x = np.array([1, 1, 2, 2, 2])
具有np.unique
的{{1}}值
如何生成以下列表:
[1, 2]
即列表[1, 2, 1, 2, 3]
中每个唯一元素从1开始的运行索引。
答案 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()
自己创建计数器)