получить наиболее частые два последовательных номера - PullRequest
0 голосов
/ 19 марта 2019
import itertools, numpy as np

a = [1,2,3,4,5]
b = [5,2,3,6,7]
c = [5,2,3,8,9]

получить наиболее частые номера:

data = np.array([a,b,c]).flatten()
print (data)

values, counts = np.unique(data, return_counts=True)

for value, frequency in zip(values, counts):
    print (value, frequency)

Как я могу получить наиболее частые два последовательных номера? Ответ [2,3]. Но как получить его программой?

Ответы [ 2 ]

3 голосов
/ 19 марта 2019

вы можете использовать collections.Counter и выполнять итерации по data в последовательных парах:

import numpy as np
from collections import Counter

a = [1,2,3,4,5]
b = [5,2,3,6,7]
c = [5,2,3,8,9]

data = np.array([a,b,c]).flatten()

c = Counter(zip(data, data[1:]))
print(c.most_common(1))
# [((2, 3), 3)]

говорю вам, что (2, 3) произошло 3 раза.


немного подробнее:

data[1:]

это ваш data без первого элемента.

zip(data, data[1:])

zip затем используется для генерации последовательных пар (как tuples)

(1, 2), (2, 3), (3, 4), (4, 5), (5, 5), (5, 2), (2, 3), ...

Counter затем просто подсчитывает, сколько раз появляются и сохраняет их dict -подобно:

Counter({(2, 3): 3, (5, 2): 2, (1, 2): 1, (3, 4): 1, (4, 5): 1, (5, 5): 1, (3, 6): 1,
         (6, 7): 1, (7, 5): 1, (3, 8): 1, (8, 9): 1})

обновление: если вам не нужны пары из другого списка, вы можете сделать это:

data = (a, b, c)

c = Counter()
for d in data:
    c.update(zip(d, d[1:]))
print(c)

или напрямую:

c = Counter(pair for d in data for pair in zip(d, d[1:]))
0 голосов
/ 19 марта 2019

Вы можете использовать Counter в соответствии с предложением @hiro protagonist, но, поскольку вы хотите обрабатывать одну строку за раз, вы должны применять ее по строкам.

from collections import Counter

Применять по строкам, используяnumpy:

data = np.array([a,b,c])

np.apply_along_axis(lambda x: Counter(zip(x, x[1:])), 1, data).sum().most_common(1)
[((2, 3), 3)]

Или, если используете панд:

import pandas as pd
data = np.array([a,b,c])
df = pd.DataFrame(data)

Теперь примените Counter вдоль строк:

df.apply(lambda x: Counter(zip(x, x[1:])), axis = 1).sum().most_common(1)

[((2, 3), 3)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...