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)