numpy的bincount函数的反函数

5

给定一个整数计数数组 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])

背景:我正在尝试同时对多组数据进行计算,并跟踪它们的位置。为了进行批处理,我将所有数据连接在一起,但我需要一个索引数组来提取结果。

当前的解决方法:

def inverse_bincount(c):
  return np.array(list(chain.from_iterable([i]*n for i,n in enumerate(c))))
3个回答

13

我知道我错过了一些非常简单的东西!谢谢! - perimosocordiae

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

1

以下内容在我的电脑上比当前接受的答案快两倍;尽管我必须说我对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”中会有重复的值。您需要将索引出现的次数合并到“p”中,而不是使用“i[p[:-1]] = 1”。 - Warren Weckesser
将代码更改为使用add.at处理零。返回True。 - Eelco Hoogendoorn
当前版本在c中存在尾随零时会失败(np.bincount不会产生这种情况,但在我的情况下出现了)。修复方法是将p[:-1]替换为p[:np.searchsorted(p,p[-1])] - Jan Šimbera

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接