【问题标题】:Count number of repeated elements in a row in a numpy array计算numpy数组中一行中重复元素的数量
【发布时间】:2020-02-01 21:34:35
【问题描述】:

我正在寻找一种快速的方法来执行以下操作: 假设我有一个数组

X = np.array([1,1,1,2,2,2,2,2,3,3,1,1,0,0,0,5])

我正在寻找连续的频率,而不是简单的元素频率。所以前 1 重复 3 次,比 2 5 次,比 3 2 次,等等。所以如果 freq 是我的函数,那么:

Y = freq(X)
Y = np.array([[1,3],[2,5],[3,2],[1,2],[0,3],[5,1]])

例如,我可以这样写:

def freq(X):
    i=0        
    Y=[]
    while i<len(X):
        el = X[i]
        el_count=0
        while X[i]==el:
            el_count +=1
            i+=1
            if i==len(X):
                break            
        Y.append(np.array([el,el_count]))

    return np.array(Y)

我正在寻找一种更快更好的方法来做到这一点。 谢谢!

【问题讨论】:

标签: python arrays numpy


【解决方案1】:

这是提高性能效率的一种 NumPy 方法 -

In [14]: m = np.r_[True,X[:-1]!=X[1:],True]

In [21]: counts = np.diff(np.flatnonzero(m))

In [22]: unq = X[m[:-1]]

In [23]: np.c_[unq,counts]
Out[23]: 
array([[1, 3],
       [2, 5],
       [3, 2],
       [1, 2],
       [0, 3],
       [5, 1]])

【讨论】:

  • 酷,不知道 r_ 和 c_ 函数
【解决方案2】:

您可以使用itertools.groupby 执行操作而无需调用numpy

import itertools

X = [1,1,1,2,2,2,2,2,3,3,1,1,0,0,0,5]

Y = [(x, len(list(y))) for x, y in itertools.groupby(X)]

print(Y)
# [(1, 3), (2, 5), (3, 2), (1, 2), (0, 3), (5, 1)]

【讨论】:

  • 这是一个非常令人愉悦的解决方案。我需要阅读 itertools。从来不知道如何使用它们。
【解决方案3】:

如果排序后输出OK,则有numpy.unique

代码

X = [1,1,1,2,2,2,2,2,3,3,1,1,0,0,0,5]

import numpy as np
(uniq, freq) = (np.unique(X, return_counts=True))
print(np.column_stack((uniq,freq)))

输出

[[0 3]
 [1 5]
 [2 5]
 [3 2]
 [5 1]]

【讨论】:

    猜你喜欢
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 2021-12-22
    • 2016-04-21
    • 1970-01-01
    相关资源
    最近更新 更多