Cách dễ nhất để xáo trộn một mảng với python là gì?
new_array = random.sample( array, len(array) )
.
Cách dễ nhất để xáo trộn một mảng với python là gì?
new_array = random.sample( array, len(array) )
.
Câu trả lời:
import random
random.shuffle(array)
import random
random.shuffle(array)
Cách khác để làm điều này bằng cách sử dụng 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)
Đầu ra:
[2, 1, 3]
['two', 'one', 'three']
Ưu điểm: Bạn có thể ngẫu nhiên nhiều mảng đồng thời mà không làm gián đoạn ánh xạ. Và 'Random_state' có thể kiểm soát sự xáo trộn cho hành vi có thể lặp lại.
Các câu trả lời khác là dễ nhất, tuy nhiên hơi khó chịu khi random.shuffle
phương thức này không thực sự trả về bất cứ thứ gì - nó chỉ sắp xếp danh sách đã cho. Nếu bạn muốn xâu chuỗi các cuộc gọi hoặc chỉ có thể khai báo một mảng được xáo trộn trong một dòng bạn có thể làm:
import random
def my_shuffle(array):
random.shuffle(array)
return array
Sau đó, bạn có thể làm các dòng như:
for suit in my_shuffle(['hearts', 'spades', 'clubs', 'diamonds']):
Khi xử lý các danh sách Python thông thường, random.shuffle()
sẽ thực hiện công việc giống như các câu trả lời trước đó hiển thị.
Nhưng khi đến ndarray
( numpy.array
), random.shuffle
dường như phá vỡ bản gốc ndarray
. Đây là một ví dụ:
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
Chỉ dùng: np.random.shuffle(a)
Giống như random.shuffle
, np.random.shuffle
xáo trộn các mảng tại chỗ.
Chỉ trong trường hợp bạn muốn một mảng mới, bạn có thể sử dụng sample
:
import random
new_array = random.sample( array, len(array) )
Bạn có thể sắp xếp mảng của bạn với khóa ngẫu nhiên
sorted(array, key = lambda x: random.random())
Phím chỉ được đọc một lần để so sánh mục trong khi sắp xếp vẫn hiệu quả.
nhưng có vẻ như random.shuffle(array)
sẽ nhanh hơn vì nó được viết bằng C
array
tôi có nghĩa là Random
phần tử: tức là trong trường lambda
hợp random.random()
có thể tạo ra thể hiện Random
lớp mới mỗi lần. Tôi thực sự không chắc chắn: trong trường hợp java
này sẽ là cách làm sai: bạn nên tạo một Random rng = Random()
và sau đó gọi rng.nextGaussian()
. Nhưng không chắc chắn làm thế nào python random.random()
hoạt động
Tôi không biết tôi đã sử dụng random.shuffle()
nhưng nó trả lại 'Không' cho tôi, vì vậy tôi đã viết cái này, có thể hữu ích cho ai đó
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
Xin lưu ý rằng random.shuffle()
không nên sử dụng trên các mảng đa chiều vì nó gây ra sự lặp lại.
Hãy tưởng tượng bạn muốn xáo trộn một mảng dọc theo chiều thứ nhất của nó, chúng ta có thể tạo ví dụ thử nghiệm sau đây,
import numpy as np
x = np.zeros((10, 2, 3))
for i in range(10):
x[i, ...] = i*np.ones((2,3))
sao cho dọc theo trục thứ nhất, phần tử thứ i tương ứng với ma trận 2x3 trong đó tất cả các phần tử đều bằng i.
Nếu chúng ta sử dụng hàm xáo trộn chính xác cho các mảng đa chiều, nghĩa là np.random.shuffle(x)
, mảng sẽ được xáo trộn dọc theo trục đầu tiên như mong muốn. Tuy nhiên, sử dụng random.shuffle(x)
sẽ gây ra sự lặp lại. Bạn có thể kiểm tra điều này bằng cách chạy len(np.unique(x))
sau khi xáo trộn, cung cấp cho bạn 10 (như mong đợi) np.random.shuffle()
nhưng chỉ khoảng 5 khi sử dụng random.shuffle()
.