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

2024-04-19 03:43:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下数组:

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

# result
In [78]: res = np.zeros_like(arr)

现在,我要计算唯一元素的移动和,并将其存储在res数组中。你知道吗

具体来说,res数组应该是:

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

[23, 45, 23, 0, 12, 45, 45]
[1,   1,   2,   1,   1,   2,   3]

我们开始计算每个元素,如果元素重新出现,则增加计数,直到到达数组的末尾。此元素特定的计数应作为结果返回。你知道吗


我们应该如何使用NumPy内置函数来实现这一点?我试过使用numpy.bincount,但结果不理想。你知道吗


Tags: innumpy元素inputnpzerosres数组
1条回答
网友
1楼 · 发布于 2024-04-19 03:43:27

不确定你会找到一个内置的,所以这里是一个自制使用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])

解释人:

我们首先使用argsort进行排序,因为我们需要索引最终返回到原始顺序。这里有一个稳定的排序是很重要的,因此使用慢合并排序。你知道吗

一旦元素被分类运行计数将形成一个“锯齿”模式。创建这个的矢量化方法是观察锯齿的diff在新齿开始的地方和其他地方都有“跳跃”值。所以这就是我们要建造的。你知道吗

相关问题 更多 >