Python numpy的逆';s二进制计数函数

Python numpy的逆';s二进制计数函数,python,numpy,Python,Numpy,给定一个整数计数数组c,如何将其转换为整数数组inds,使np.all(np.bincount(inds)==c)为真 例如: >>> c = np.array([1,3,2,2]) >>> inverse_bincount(c) # <-- what I need array([0,1,1,1,2,2,3,3]) 使用: 不需要numpy: c = [1,3,2,2] reduce(lambda x,y: x + [y] * c[y], rang

给定一个整数计数数组
c
,如何将其转换为整数数组
inds
,使
np.all(np.bincount(inds)==c)
为真

例如:

>>> c = np.array([1,3,2,2])
>>> inverse_bincount(c)  # <-- what I need

array([0,1,1,1,2,2,3,3])
使用:

不需要numpy:

c = [1,3,2,2]
reduce(lambda x,y: x + [y] * c[y], range(len(c)), [])

在我的机器上,以下速度大约是当前接受答案速度的两倍;尽管我必须说,我对np.repeat的表现感到惊讶。我希望它会因为临时对象的创建而遭受很多痛苦,但它做得相当不错

import numpy as np
c = np.array([1,3,2,2])
p = np.cumsum(c)
i = np.zeros(p[-1],np.int)
np.add.at(i, p[:-1], 1)
print np.cumsum(i)

我知道我错过了一些非常简单的事情!谢谢很好,但如果其中一个计数为0,则这不起作用。然后在
p
中有一个重复值。而不是
i[p[:-1]]=1
,您需要将索引的出现次数合并到
p
。True;使用add.at将代码更改为处理零。如果c中有尾随零,当前版本将失败(这
np.bincount
不会产生,但在我的示例中会出现)。修复方法是将
p[:-1]
替换为
p[:np.searchsorted(p,p[-1])]
c = [1,3,2,2]
reduce(lambda x,y: x + [y] * c[y], range(len(c)), [])
import numpy as np
c = np.array([1,3,2,2])
p = np.cumsum(c)
i = np.zeros(p[-1],np.int)
np.add.at(i, p[:-1], 1)
print np.cumsum(i)