web-dev-qa-db-ja.com

Pythonで配列をシャッフルし、pythonで配列項目の順序をランダム化します

Pythonで配列をシャッフルする最も簡単な方法は何ですか?

229
davethegr8
import random
random.shuffle(array)
419
David Z
import random
random.shuffle(array)
106
Douglas Leeder

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)

出力:

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

利点:マッピングを中断することなく、複数のアレイを同時にランダム化できます。また、「random_state」は、再現可能な動作のシャッフルを制御できます。

27
Qy Zuo

他の答えは最も簡単ですが、random.shuffleメソッドが実際に何も返さないことは少し面倒です-指定されたリストをソートするだけです。呼び出しを連鎖させたい場合、またはシャッフルされた配列を1行で宣言できる場合は、次のようにします。

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

次に、次のような行を実行できます。

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

通常のPythonリストを扱う場合、random.shuffle()が前の答えが示すように仕事をします。

しかし、ndarraynumpy.array)に関しては、random.shuffleは元のndarrayを壊しているようです。以下に例を示します。

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

使用するのは:np.random.shuffle(a)

random.shuffleと同様に、np.random.shuffleは配列をその場でシャッフルします。

11
Shuai Zhang

新しい配列が必要な場合に備えて、sampleを使用できます。

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

ランダムキーで配列をソートできます

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

しかし、random.shuffle(array)はCで記述されているため、より高速になります

2
Trinh Hoang Nhu

前の返信に加えて、別の機能を紹介したいと思います。

numpy.random.shuffleおよびrandom.shuffleは、インプレースシャッフルを実行します。ただし、シャッフルされた配列を返したい場合は、numpy.random.permutationが使用する関数です。

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

random.shuffle()を使用したことはわかりませんが、「None」が返されるので、これを書いたので、誰かに役立つかもしれません

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