Подсчитать количество повторяющихся элементов в строке в массиве - PullRequest
2 голосов
/ 03 октября 2019

Я ищу быстрый способ сделать следующее: скажем, у меня есть массив

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)

Я ищу более быстрый и приятный способ сделать это. Спасибо!

Ответы [ 2 ]

2 голосов
/ 03 октября 2019

Вот один способ 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]])
1 голос
/ 03 октября 2019

Вы можете использовать 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)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...