import itertools, numpy as np

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

Obtenir les numéros les plus fréquents:

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)

Comment puis-je obtenir le plus souvent deux numéros consécutifs? La réponse est [2,3]. Mais comment l'obtenir par programme?

0
user10772275 19 mars 2019 à 11:10

2 réponses

Meilleure réponse

Vous pouvez utiliser collections.Counter et itérer sur data par paires consécutives :

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

Vous disant que (2, 3) s'est produit 3 fois.


Un peu plus de détail :

data[1:]

Est votre data sans son premier élément.

zip(data, data[1:])

zip est ensuite utilisé pour générer les paires consécutives ( comme tuples)

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

Le Counter compte alors juste combien de fois ils apparaissent et les stocke comme 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})

Mise à jour : si vous ne voulez pas de paires d'une liste différente, vous pouvez le faire :

data = (a, b, c)

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

Ou directement:

c = Counter(pair for d in data for pair in zip(d, d[1:]))
3
hiro protagonist 19 mars 2019 à 10:09

Vous pouvez utiliser Counter comme suggéré par le protagoniste @hiro, mais comme vous voulez traiter une ligne à la fois, vous devez l'appliquer le long des lignes.

from collections import Counter

Appliquer le long des lignes en utilisant 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)]

Ou, si vous utilisez des pandas:

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

Maintenant, appliquez Counter le long des lignes:

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

[((2, 3), 3)]
0
akilat90 19 mars 2019 à 09:08