est ici une façon ...
Pour rendre l'exemple plus facile à lire, je vais utiliser une valeur maximale de 9 au lieu de 31:
In [178]: maxval = 9
Faire une entrée aléatoire pour l'exemple:
In [179]: np.random.seed(123)
In [180]: x = np.random.randint(0, maxval+1, size=100)
Créer le résultat, d'abord tout 0:
In [181]: counts = np.zeros((maxval+1, maxval+1), dtype=int)
Maintenant, ajoutez 1 à chaque paire de coordonnées, en utilisant numpy.add.at
pour faire en sorte que les doublons sont comptés correctement:
In [182]: np.add.at(counts, (x[:-1], x[1:]), 1)
In [183]: counts
Out[183]:
array([[2, 1, 1, 0, 1, 0, 1, 1, 1, 1],
[2, 1, 1, 3, 0, 2, 1, 1, 1, 1],
[0, 2, 1, 1, 4, 0, 2, 0, 0, 0],
[1, 1, 1, 3, 3, 3, 0, 0, 1, 2],
[1, 1, 0, 1, 1, 0, 2, 2, 2, 0],
[1, 0, 0, 0, 0, 0, 1, 1, 0, 2],
[0, 4, 2, 3, 1, 0, 2, 1, 0, 1],
[0, 1, 1, 1, 0, 0, 2, 0, 0, 3],
[1, 2, 0, 1, 0, 0, 1, 0, 0, 0],
[2, 0, 2, 2, 0, 0, 2, 2, 0, 0]])
Par exemple, le nombre de fois 6 est suivi par 1 est
In [188]: counts[6, 1]
Out[188]: 4
Nous pouvons vérifier qu'avec l'expression suivante:
In [189]: ((x[:-1] == 6) & (x[1:] == 1)).sum()
Out[189]: 4
Ceci est une solution très élégante. Bien que j'ai besoin d'étudier comment cette fonction numpy fonctionne réellement pour comprendre ce qui se passe! – valentin