2015-06-13 16 views
5

Tôi cần thực hiện lựa chọn ngẫu nhiên với xác suất đã chọn để chọn một bộ từ danh sách.Làm thế nào để sử dụng numpy.random.choice trong danh sách các bộ dữ liệu?

EDIT: Các probabiliy cho mỗi tuple có trong danh sách probabilit Tôi không biết quên thay thế tham số, theo mặc định là không Vấn đề tương tự sử dụng một mảng thay vì một danh sách

Mẫu tiếp theo đang cho tôi một lỗi:

import numpy as np 

probabilit = [0.333, 0.333, 0.333] 
lista_elegir = [(3, 3), (3, 4), (3, 5)] 

np.random.choice(lista_elegir, 1, probabilit) 

Và lỗi này là:

ValueError: a must be 1-dimensional 

thế nào có thể tôi giải quyết điều đó?

+0

Nếu bạn chỉ muốn vẽ các phần tử có xác suất bằng nhau, bạn có thể sử dụng 'random.choice' từ lib chuẩn. – cel

+0

Tôi có phiên bản không rõ ràng nên tôi không thể kiểm tra, nhưng theo [tài liệu] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.choice.html#numpy.random .choice), bạn đã thử tạo danh sách một mảng 'numpy 'chưa? Ngoài ra, có vẻ như bạn đang thiếu tham số thứ ba 'replace'. –

Trả lời

7

Theo doc của chức năng,

a : 1-D array-like or int 
    If an ndarray, a random sample is generated from its elements. 
    If an int, the random sample is generated as if a was np.arange(n) 

Vì vậy, sau đó

lista_elegir[np.random.choice(len(lista_elegir),1,p=probabilit)] 

nên làm những gì bạn muốn. (p= được thêm vào theo nhận xét; có thể bỏ qua nếu các giá trị là thống nhất).

Chọn số từ [0,1,2], sau đó chọn yếu tố đó từ danh sách của bạn.

+0

Trong Python 3.6 ở trên mang lại cho tôi một lỗi khi lấy mẫu nhiều hơn một mục: 'chỉ mảng số nguyên scaler có thể được chuyển đổi thành một chỉ số scaler'. Điều này không được giải quyết bằng cách truyền sang 'int' hoặc sử dụng' range (len (x)) 'thay vì' len (x) '. Một giải pháp là sử dụng nội tuyến cho vòng lặp: '[x [i] cho i trong np.choice (len (x), n)]' hoạt động tốt – Scipio

2

Vấn đề là danh sách các bộ dữ liệu được hiểu là một mảng 2D, trong khi choice chỉ hoạt động với 1D-mảng hoặc số nguyên (được hiểu là "chọn từ phạm vi"). Xem the documentation.

Vì vậy, một cách để khắc phục điều này là vượt qua len trong danh sách bộ dữ liệu, sau đó chọn các phần tử có chỉ mục tương ứng (hoặc chỉ mục), như được mô tả trong other answer. Nếu bạn bật lista_elegir thành một số np.array trước, điều này cũng sẽ hoạt động đối với nhiều chỉ mục. Tuy nhiên, có thêm hai vấn đề:

Thứ nhất, theo cách bạn gọi hàm, probabilit sẽ được hiểu là tham số thứ ba, replace, không như xác suất, tức là danh sách được hiểu như là một boolean , có nghĩa là bạn chọn thay thế, nhưng xác suất thực tế bị bỏ qua. Bạn có thể dễ dàng kiểm tra điều này bằng cách chuyển tham số thứ ba là [1, 0, 0]. Sử dụng p=probabilit để thay thế. Thứ hai, xác suất phải tổng hợp lên 1, chính xác. Bạn chỉ có 0.999. Có vẻ như bạn sẽ phải nghiêng các xác suất một cách nhẹ nhàng, hoặc chỉ để lại tham số đó là None nếu chúng giống nhau (do đó giả định phân bố đều).

>>> probabilit = [0.333, 0.333, 0.333] 
>>> lista_elegir = np.array([(3, 3), (3, 4), (3, 5)]) # for multiple indices 
>>> indices = np.random.choice(len(lista_elegir), 2, p=probabilit if len(set(probabilit)) > 1 else None) 
>>> lista_elegir[indices] 
array([[3, 4], 
     [3, 5]]) 
Các vấn đề liên quan