Pythonで配列をシャッフルする最も簡単な方法は何ですか?
import random
random.shuffle(array)
import random
random.shuffle(array)
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」は、再現可能な動作のシャッフルを制御できます。
他の答えは最も簡単ですが、random.shuffle
メソッドが実際に何も返さないことは少し面倒です-指定されたリストをソートするだけです。呼び出しを連鎖させたい場合、またはシャッフルされた配列を1行で宣言できる場合は、次のようにします。
import random
def my_shuffle(array):
random.shuffle(array)
return array
次に、次のような行を実行できます。
for suit in my_shuffle(['hearts', 'spades', 'clubs', 'diamonds']):
通常のPythonリストを扱う場合、random.shuffle()
が前の答えが示すように仕事をします。
しかし、ndarray
(numpy.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
は配列をその場でシャッフルします。
新しい配列が必要な場合に備えて、sample
を使用できます。
import random
new_array = random.sample( array, len(array) )
ランダムキーで配列をソートできます
sorted(array, key = lambda x: random.random())
しかし、random.shuffle(array)
はCで記述されているため、より高速になります
前の返信に加えて、別の機能を紹介したいと思います。
numpy.random.shuffle
およびrandom.shuffle
は、インプレースシャッフルを実行します。ただし、シャッフルされた配列を返したい場合は、numpy.random.permutation
が使用する関数です。
# 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]
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