在numpy数组中计算一行中重复元素的数量

5

我希望您能够快速找到以下内容的解决方法: 假设我有一个数组

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)

我正在寻找一种更快更好的方法来完成这个任务。谢谢!


1
使用 itertools.groupby - Dani Mesejo
可能是[在numpy数组中查找相同值序列的长度(运行长度编码)]的重复问题(https://dev59.com/k3NA5IYBdhLWcg3wKai3)。 - Randy
3个回答

4
如果需要排序输出,可以使用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]]

4
这里有一个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]])

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)]

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