代码之家  ›  专栏  ›  技术社区  ›  kmario23 Mazdak

计算NumPy数组上的“移动计数和”

  •  1
  • kmario23 Mazdak  · 技术社区  · 7 年前

    我有以下数组:

    # input
    In [77]: arr = np.array([23, 45, 23, 0, 12, 45, 45])
    
    # result
    In [78]: res = np.zeros_like(arr)
    

    现在,我想计算一个 并将其储存在 res 数组。

    具体来说, 数组应为:

    In [79]: res
    Out[79]: array([1, 1, 2, 1, 1, 2, 3])
    


    [1, 1, 2, 1, 1, 2, 3]

    计数 如果一个元素重新出现,直到我们到达数组的末尾。此元素特定的计数应作为结果返回。


    我们应该如何使用NumPy内置函数来实现这一点?我试过用 numpy.bincount

    1 回复  |  直到 7 年前
        1
  •  3
  •   Paul Panzer    7 年前

    不确定你会找到一个内置的,所以这里是一个自制使用argsort。

    def running_count(arr):
        idx = arr.argsort(kind='mergesort')
        sarr = arr[idx]
        neq = np.where(sarr[1:] != sarr[:-1])[0] + 1
        run = np.ones(arr.shape, int)
        run[neq[0]] -= neq[0]
        run[neq[1:]] -= np.diff(neq)
        res = np.empty_like(run)
        res[idx] = run.cumsum()
        return res
    

    例如:

    >>> running_count(arr)
    array([1, 1, 2, 1, 1, 2, 3])
    >>> running_count(np.array(list("xabaaybeeetz")))
    array([1, 1, 1, 2, 3, 1, 2, 1, 2, 3, 1, 1])
    

    解释人: