Numpy: Nhận tập hợp các hàng ngẫu nhiên từ mảng 2D


159

Tôi có một mảng 2D rất lớn trông giống như thế này:

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

Sử dụng numpy, có cách nào 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ế) không?

ví dụ

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

8
thật ngớ ngẩn khi có một câu hỏi thay thế và một câu hỏi không có, bạn chỉ nên cho phép cả hai câu trả lời và trên thực tế khuyến khích cả hai câu trả lời.
Pinocchio

Câu trả lời:


193
>>> 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]])

Đặt nó cùng nhau cho 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 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.


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

1
Trước numpy 1.7, sử dụng ngẫu nhiên .sample (xrange (10), 2)
denis

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

48

Đây là một bài viết cũ, nhưng đây là những gì làm việc tốt nhất cho tôi:

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

thay thế thay thế = Sai thành Đúng để có được điều tương tự, nhưng với thay thế.


2
@SalvadorDali Tôi đã chỉnh sửa bài đăng của Hezi để không chọn thay thế. Khi chỉnh sửa là peer-xem xét lại, bạn sẽ thấy thêm replace=Falseparam để choice.
0x24a537r9

8
@ 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, đừ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
Salvador Dali

@SalvadorDali tại sao không?
Scott

25

Một tùy chọn khác là tạo mặt nạ ngẫu nhiên nếu bạn chỉ muốn lấy mẫu dữ liệu của mình theo một yếu tố nhất định. Giả sử tôi muốn giảm mẫu xuống 25% bộ dữ liệu ban đầu của mình, hiện đang được giữ 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ả lại ~ 25% số hàng, được lấy mẫu ngẫu nhiên.


10

Đây là một câu trả lời tương tự như câu trả lời của Hezi Rasheff, nhưng đơn giản hóa để người dùng python mới hơn hiểu được những gì đang diễn ra (Tôi nhận thấy nhiều sinh viên dữ liệu mới lấy mẫu ngẫu nhiên theo những cách kỳ lạ nhất vì họ không biết họ đang làm gì với python).

Bạn có thể nhận được một số chỉ số ngẫu nhiên từ mảng của mình bằng cách sử dụng:

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

Sau đó, bạn có thể sử dụng cắt lát với mảng numpy của mình để lấy các mẫu tại các chỉ số đó:

A[indices]

Điều này sẽ giúp bạn có được số lượng mẫu ngẫu nhiên được chỉ định từ dữ liệu của bạn.


5

Nếu bạn cần các hàng giống nhau nhưng chỉ là một mẫu ngẫu nhiên,

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

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


3
Điều này chỉ hoạt động nếu old_arraylà một chuỗi hoặc một bộ, không phải là một mảng NumPy [link] ( docs.python.org/3/library/random.html#functions-for-sequences )
leermeester

5

Tôi thấy hoán vị đã được đề xuất. Trong thực tế, nó có thể được thực hiện thành một dòng:

>>> A = np.random.randint(5, size=(10,3))
>>> np.random.permutation(A)[:2]

array([[0, 3, 0],
       [3, 1, 2]])

2

Nếu bạn muốn tạo nhiều tập hợp con ngẫu nhiên của các hàng, ví dụ nếu bạn thực hiện RANSAC.

num_pop = 10
num_samples = 2
pop_in_sample = 3
rows_to_sample = np.random.random([num_pop, 5])
random_numbers = np.random.random([num_samples, num_pop])
samples = np.argsort(random_numbers, axis=1)[:, :pop_in_sample]
# will be shape [num_samples, pop_in_sample, 5]
row_subsets = rows_to_sample[samples, :]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.