J'ai deux tableaux numpy de formes différentes, mais avec la même longueur (dimension principale). Je veux mélanger chacun d'eux, de sorte que les éléments correspondants continuent de correspondre - c'est-à-dire les mélanger à l'unisson par rapport à leurs principaux indices.
Ce code fonctionne et illustre mes objectifs:
def shuffle_in_unison(a, b):
assert len(a) == len(b)
shuffled_a = numpy.empty(a.shape, dtype=a.dtype)
shuffled_b = numpy.empty(b.shape, dtype=b.dtype)
permutation = numpy.random.permutation(len(a))
for old_index, new_index in enumerate(permutation):
shuffled_a[new_index] = a[old_index]
shuffled_b[new_index] = b[old_index]
return shuffled_a, shuffled_b
Par exemple:
>>> a = numpy.asarray([[1, 1], [2, 2], [3, 3]])
>>> b = numpy.asarray([1, 2, 3])
>>> shuffle_in_unison(a, b)
(array([[2, 2],
[1, 1],
[3, 3]]), array([2, 1, 3]))
Cependant, cela semble maladroit, inefficace et lent, et cela nécessite de faire une copie des tableaux - je préfère les mélanger en place, car ils seront assez grands.
Y a-t-il une meilleure façon de procéder? Une exécution plus rapide et une utilisation réduite de la mémoire sont mes principaux objectifs, mais un code élégant serait également bien.
Une autre pensée que j'avais était la suivante:
def shuffle_in_unison_scary(a, b):
rng_state = numpy.random.get_state()
numpy.random.shuffle(a)
numpy.random.set_state(rng_state)
numpy.random.shuffle(b)
Cela fonctionne ... mais c'est un peu effrayant, car je ne vois aucune garantie que cela continuera à fonctionner - cela ne ressemble pas au genre de chose qui est garantie de survivre à travers la version numpy, par exemple.