2013-11-25 13 views
9

Giả sử bạn có numpy vectơ [0,3,1,1,1] và bạn chạy argsort bạn sẽ nhận được [0,2,3,4,1] nhưng tất cả đều giống nhau! Điều tôi muốn là cách hiệu quả để trộn các chỉ mục có giá trị giống hệt nhau. Bất kỳ ý tưởng làm thế nào để làm điều đó mà không có một vòng lặp while với hai chỉ số trên vector được sắp xếp?làm thế nào để làm cho kết quả argsort được ngẫu nhiên giữa các giá trị bằng nhau?

numpy.array([0,3,1,1,1]).argsort() 

Trả lời

3

Đây là một chút hack, nhưng nếu mảng của bạn chỉ chứa số nguyên bạn có thể thêm giá trị ngẫu nhiên và argsort kết quả. np.random.rand cung cấp cho bạn kết quả trong [0, 1) vì vậy trong trường hợp này, bạn được đảm bảo duy trì thứ tự cho các phần tử không giống hệt nhau.

>>> import numpy as np 
>>> arr = np.array([0,3,1,1,1]) 
>>> np.argsort(arr + np.random.rand(*arr.shape)) 
array([0, 4, 3, 2, 1]) 
>>> np.argsort(arr + np.random.rand(*arr.shape)) 
array([0, 3, 4, 2, 1]) 
>>> np.argsort(arr + np.random.rand(*arr.shape)) 
array([0, 3, 4, 2, 1]) 
>>> np.argsort(arr + np.random.rand(*arr.shape)) 
array([0, 2, 3, 4, 1]) 
>>> np.argsort(arr + np.random.rand(*arr.shape)) 
array([0, 2, 3, 4, 1]) 
>>> np.argsort(arr + np.random.rand(*arr.shape)) 
array([0, 4, 2, 3, 1]) 

đây chúng ta thấy chỉ số 0 luôn là đầu tiên trong argsort kết quả và chỉ số 1 là cuối cùng, nhưng phần còn lại của các kết quả đang ở trong một thứ tự ngẫu nhiên.

Nói chung, bạn có thể tạo ra các giá trị ngẫu nhiên bị ràng buộc bởi np.diff(np.sort(arr)).max(), nhưng bạn có thể gặp sự cố chính xác tại một số điểm.

+0

Không phải là nó quá lớn một giả định để đảm nhận các vectơ chỉ chứa số nguyên? –

+0

Vâng, tôi không biết. Tôi đã đi vào những gì đã được đưa ra trong câu hỏi và nó được thừa nhận trong câu trả lời của tôi. Giải pháp của bạn là gọn gàng mặc dù. – YXD

11

Sử dụng lexsort: np.lexsort((b,a)) nghĩa Sắp xếp theo a, sau đó bởi b

>>> a 
array([0, 3, 1, 1, 1]) 
>>> b=np.random.random(a.size) 
>>> b 
array([ 0.00673736, 0.90089115, 0.31407214, 0.24299867, 0.7223546 ]) 
>>> np.lexsort((b,a)) 
array([0, 3, 2, 4, 1]) 
>>> a.argsort() 
array([0, 2, 3, 4, 1]) 
>>> a[[0, 3, 2, 4, 1]] 
array([0, 1, 1, 1, 3]) 
>>> a[[0, 2, 3, 4, 1]] 
array([0, 1, 1, 1, 3]) 
Các vấn đề liên quan