Apa cara termudah untuk mengocok array dengan python?
new_array = random.sample( array, len(array) )
.
Apa cara termudah untuk mengocok array dengan python?
new_array = random.sample( array, len(array) )
.
Jawaban:
import random
random.shuffle(array)
import random
random.shuffle(array)
Cara alternatif untuk melakukan ini menggunakan 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)
Keluaran:
[2, 1, 3]
['two', 'one', 'three']
Keuntungan: Anda dapat mengacak banyak array secara bersamaan tanpa mengganggu pemetaan. Dan 'random_state' dapat mengontrol pengocokan untuk perilaku yang dapat direproduksi.
Jawaban lainnya adalah yang termudah, namun agak menjengkelkan bahwa random.shuffle
metode ini tidak mengembalikan apa pun - hanya mengurutkan daftar yang diberikan. Jika Anda ingin membuat panggilan atau hanya dapat mendeklarasikan array yang diacak dalam satu baris, Anda dapat melakukannya:
import random
def my_shuffle(array):
random.shuffle(array)
return array
Maka Anda dapat melakukan baris seperti:
for suit in my_shuffle(['hearts', 'spades', 'clubs', 'diamonds']):
Ketika berhadapan dengan daftar Python biasa, random.shuffle()
akan melakukan pekerjaan seperti yang ditunjukkan oleh jawaban sebelumnya.
Tetapi ketika datang ke ndarray
( numpy.array
), random.shuffle
tampaknya melanggar aslinya ndarray
. Berikut ini sebuah contoh:
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
Cukup gunakan: np.random.shuffle(a)
Seperti random.shuffle
, np.random.shuffle
mengocok array di tempat.
Jika Anda menginginkan array baru, Anda dapat menggunakan sample
:
import random
new_array = random.sample( array, len(array) )
Anda dapat mengurutkan array dengan kunci acak
sorted(array, key = lambda x: random.random())
kunci hanya dapat dibaca sekali sehingga membandingkan item selama sortir masih efisien.
tapi sepertinya random.shuffle(array)
akan lebih cepat karena ditulis dalam C
array
saya berarti Random
elemen: yaitu di lambda
dalam random.random()
mungkin menghasilkan baru Random
kelas misalnya setiap kali. Saya sebenarnya tidak yakin: dalam java
hal ini akan menjadi cara yang salah untuk melakukannya: Anda harus membuat Random rng = Random()
dan kemudian memohon rng.nextGaussian()
. Tetapi tidak yakin bagaimana python random.random()
bekerja
Saya tidak tahu saya menggunakan random.shuffle()
tetapi mengembalikan 'Tidak ada' kepada saya, jadi saya menulis ini, mungkin membantu seseorang
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
Sadarilah bahwa random.shuffle()
tidak boleh digunakan pada array multi-dimensi karena menyebabkan pengulangan.
Bayangkan Anda ingin mengocok array di sepanjang dimensi pertama, kita dapat membuat contoh pengujian berikut,
import numpy as np
x = np.zeros((10, 2, 3))
for i in range(10):
x[i, ...] = i*np.ones((2,3))
sehingga sepanjang sumbu pertama, elemen ke-i sesuai dengan matriks 2x3 di mana semua elemen sama dengan i.
Jika kita menggunakan fungsi shuffle yang benar untuk array multi-dimensi, yaitu np.random.shuffle(x)
array akan dikocok sepanjang sumbu pertama seperti yang diinginkan. Namun, menggunakan random.shuffle(x)
akan menyebabkan pengulangan. Anda dapat memeriksa ini dengan menjalankan len(np.unique(x))
setelah pengocokan yang memberi Anda 10 (seperti yang diharapkan) dengan np.random.shuffle()
tetapi hanya sekitar 5 saat menggunakan random.shuffle()
.