2013-01-10 36 views
76

Tôi có một mảng 2D rất lớn mà trông giống như sau:NumPy: Nhận đặt ngẫu nhiên của các hàng từ mảng 2D

a= 
[[a1, b1, c1], 
[a2, b2, c2], 
..., 
[an, bn, cn]] 

Sử dụng NumPy, là có một cách dễ dàng để có được một mảng 2D mới với ví dụ 2 hàng ngẫu nhiên từ mảng ban đầu a (không thay thế)?

ví dụ:

b= 
[[a4, b4, c4], 
[a99, b99, c99]] 
+2

ngớ ngẩn của nó để có câu hỏi thay thế và không có, bạn chỉ nên cho phép cả hai câu trả lời và thực tế khuyến khích cả hai câu trả lời. – Pinocchio

Trả lời

85
>>> A = np.random.randint(5, size=(10,3)) 
>>> A 
array([[1, 3, 0], 
     [3, 2, 0], 
     [0, 2, 1], 
     [1, 1, 4], 
     [3, 2, 2], 
     [0, 1, 0], 
     [1, 3, 1], 
     [0, 4, 1], 
     [2, 4, 2], 
     [3, 3, 1]]) 
>>> idx = np.random.randint(10, size=2) 
>>> idx 
array([7, 6]) 
>>> A[idx,:] 
array([[0, 4, 1], 
     [1, 3, 1]]) 

Đưa nó cùng nhau trong một trường hợp chung:

A[np.random.randint(A.shape[0], size=2), :] 

Đối với không thay thế (NumPy 1.7.0+):

A[np.random.choice(A.shape[0], 2, replace=False), :] 

Tôi không tin rằng có một cách tốt để tạo danh sách ngẫu nhiên mà không cần thay thế trước 1.7. Có lẽ bạn có thể thiết lập một định nghĩa nhỏ đảm bảo hai giá trị không giống nhau.

+3

Có thể không phải là một cách tốt, nhưng một cách tốt như 'np.random.choice', và đó là' np.random.permutation (A.shape [0]) [: 2] ', trên thực tế nó không tuyệt vời, nhưng đó là những gì 'np.random.choice' tại thời điểm này ... hoặc nếu bạn không quan tâm thay đổi mảng của bạn tại chỗ,' np.random.shuffle' – seberg

+1

Trước khi numpy 1.7, sử dụng [ ngẫu nhiên] (http://docs.python.org/2.7/library/random.html) .sample (xrange (10), 2) – denis

+1

tại sao bạn đặt tên biến A và B và các công cụ? nó làm cho nó khó đọc hơn. – Pinocchio

20

Đây là một bài cũ, nhưng đây là những gì phù hợp nhất đối với tôi:

A[np.random.choice(A.shape[0], num_rows_2_sample, replace=False)] 

thay đổi các thay = False True để có được những điều tương tự, nhưng với sự thay thế.

+0

@SalvadorDali Tôi đã chỉnh sửa bài đăng của Hezi để không chọn thay thế. Khi chỉnh sửa được xem xét ngang hàng, bạn sẽ thấy tham số 'replace = False' được thêm vào' choice'. – 0x24a537r9

+1

@ 0x24a537r9 bạn không nên làm điều này. Đây là câu trả lời của anh ấy và bạn thay đổi nó. Nếu bạn muốn - thêm câu trả lời của bạn không thay đổi câu trả lời của người khác làm thay đổi đáng kể câu trả lời –

+0

@ 0x24a537r9 Bạn có thể đăng câu trả lời mà không cần thay thế không? – ocean800

18

Tùy chọn khác là tạo mặt nạ ngẫu nhiên nếu bạn chỉ muốn giảm mẫu dữ liệu của mình theo một yếu tố nhất định. Nói rằng tôi muốn xuống mẫu đến 25% của bộ dữ liệu ban đầu của tôi, mà hiện nay được tổ chức trong mảng data_arr:

# generate random boolean mask the length of data 
# use p 0.75 for False and 0.25 for True 
mask = numpy.random.choice([False, True], len(data_arr), p=[0.75, 0.25]) 

Bây giờ bạn có thể gọi data_arr[mask] và trở về ~ 25% của các hàng, lấy mẫu ngẫu nhiên.

3

Nếu bạn cần các hàng tương tự nhưng chỉ là một mẫu ngẫu nhiên sau đó,

import random 
new_array = random.sample(old_array,x) 

Ở đây x, phải có một 'int' xác định số hàng bạn muốn chọn một cách ngẫu nhiên.

Các vấn đề liên quan