这是我拥有的 numpy 数组的示例:
y = np.array([
[ 0],
[ 0],
[ 2],
[ 1],
[ 0],
[ 1],
[ 3],
[-1],
])
我正在尝试生成一个新列,其中包含输入数组中每个值的累积计数:
y = np.array([
[ 0, 1],
[ 0, 2],
[ 2, 1],
[ 1, 1],
[ 0, 3],
[ 1, 2],
[ 3, 1],
[-1, 1],
])
到目前为止,我一直在使用以下 pandas 实现来解决这个问题:
y_pd = pd.DataFrame(y, columns=['LABEL'])
y_pd = pd.concat([
y_pd,
y_pd.groupby('LABEL').cumcount().to_frame().rename(columns = {0:'cumcounts'}) +1
], axis=1)
尽管我正在寻找 numpy 实现。这是我对同一问题的 numpy 实现:
y_np = np.hstack([y, y])
for label in np.unique(y_np):
slice_length = (y_np[:, -2]==label).sum()
y_np[y_np[:, -2]==label, -1] = range(1, slice_length+1)
但是我觉得使用 for 循环的聚合可以通过更快的矢量化实现来执行。
我已经检查了以下链接来尝试解决这个问题,但没有成功:
您能在这方面提供任何帮助吗?
注意:我拥有的 numpy 数组实际上在基数和字段数量方面要大得多,在此过程中不应更改记录的顺序。
如何使用 numpy 在线性时间内通过唯一值获取累积计数? 看起来就像您正在寻找的。
下面是它的经过时间测试得到最多支持的答案在你的情况下产生的结果,重新塑造成2D堆叠格式(不是公认的格式,它没有时间研究并受到负面批评,应该再次验证)。
cumcount(np.ravel(y))+1
返回预期累计值计数 array([1, 2, 1, 1, 3, 2, 1, 1])
重塑:
np.hstack((y,
np.atleast_2d(cumcount(np.ravel(y))+1).T))
array([[ 0, 1],
[ 0, 2],
[ 2, 1],
[ 1, 1],
[ 0, 3],
[ 1, 2],
[ 3, 1],
[-1, 1]])