【问题标题】:Inverse of numpy's bincount functionnumpy 的 bincount 函数的逆
【发布时间】:2014-03-26 19:28:00
【问题描述】:

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

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    使用numpy.repeat

    np.repeat(np.arange(c.size), c)
    

    【讨论】:

    • 我知道我错过了一些非常简单的东西!谢谢!
    【解决方案2】:

    不需要numpy:

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

    【讨论】:

      【解决方案3】:

      以下在我的机器上的速度大约是当前接受的答案的两倍;虽然我必须说我对 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
      • 真;使用 add.at 更改代码以处理零。
      • 如果 c 中有尾随零(np.bincount 不会产生,但在我的情况下出现),则当前版本失败。解决方法是将p[:-1] 替换为p[:np.searchsorted(p,p[-1])]
      猜你喜欢
      • 2020-03-22
      • 2017-03-28
      • 1970-01-01
      • 2020-10-24
      • 1970-01-01
      • 2018-02-25
      • 1970-01-01
      相关资源
      最近更新 更多