web-dev-qa-db-fra.com

Mélangez un tableau avec python, randomisez l'ordre des éléments avec python

Quel est le moyen le plus simple de mélanger un tableau avec Python?

216
davethegr8
import random
random.shuffle(array)
397
David Z
import random
random.shuffle(array)
105
Douglas Leeder

Une manière alternative de faire cela en utilisant sklearn

from sklearn.utils import shuffle
X=[1,2,3]
y = ['one', 'two', 'three']
X, y = shuffle(X, y, random_state=0)
print(X)
print(y)

Sortie:

[2, 1, 3]
['two', 'one', 'three']

Avantage: vous pouvez aléatoire plusieurs tableaux simultanément sans perturber le mappage. Et 'random_state' peut contrôler le brassage pour un comportement reproductible.

22
Qy Zuo

Les autres réponses sont les plus faciles, mais il est un peu gênant que la méthode random.shuffle ne renvoie rien en réalité - elle trie simplement la liste donnée. Si vous voulez enchaîner des appels ou simplement pouvoir déclarer un tableau mélangé sur une ligne, vous pouvez faire:

    import random
    def my_shuffle(array):
        random.shuffle(array)
        return array

Ensuite, vous pouvez faire des lignes comme:

    for suit in my_shuffle(['hearts', 'spades', 'clubs', 'diamonds']):
21
Mark Rhodes

Lorsque vous manipulez des listes Python normales, random.shuffle() fera le travail exactement comme le montrent les réponses précédentes.

Mais quand il s'agit de ndarray (numpy.array), random.shuffle semble rompre l'original ndarray. Voici un exemple:

import random
import numpy as np
import numpy.random

a = np.array([1,2,3,4,5,6])
a.shape = (3,2)
print a
random.shuffle(a) # a will definitely be destroyed
print a

Il suffit d'utiliser: np.random.shuffle(a)

Comme random.shuffle, np.random.shuffle mélange le tableau sur place.

11
Shuai Zhang

Juste au cas où vous voudriez un nouveau tableau, vous pouvez utiliser sample:

import random
new_array = random.sample( array, len(array) )
5
Charlie Parker

Vous pouvez trier votre tableau avec une clé aléatoire

sorted(array, key = lambda x: random.random())

mais ressembler à random.shuffle(array) sera plus rapide puisqu'il écrit en C

2
Trinh Hoang Nhu

Outre les réponses précédentes, je voudrais introduire une autre fonction.

numpy.random.shuffle ainsi que random.shuffle effectuent un brassage sur place. Toutefois, si vous souhaitez renvoyer un tableau mélangé, numpy.random.permutation est la fonction à utiliser.

1
Saber
# arr = numpy array to shuffle

def shuffle(arr):
    a = numpy.arange(len(arr))
    b = numpy.empty(1)
    for i in range(len(arr)):
        sel = numpy.random.random_integers(0, high=len(a)-1, size=1)
        b = numpy.append(b, a[sel])
        a = numpy.delete(a, sel)
    b = b[1:].astype(int)
    return arr[b]
0
sudeep

Je ne sais pas si j'ai utilisé random.shuffle() mais il me renvoie "Aucun", alors j'ai écrit ceci, cela pourrait être utile à quelqu'un

def shuffle(arr):
    for n in range(len(arr) - 1):
        rnd = random.randint(0, (len(arr) - 1))
        val1 = arr[rnd]
        val2 = arr[rnd - 1]

        arr[rnd - 1] = val1
        arr[rnd] = val2

    return arr
0
Jeeva