Về cơ bản bạn cần phải thực hiện argsort
, việc triển khai bạn cần phụ thuộc vào việc bạn muốn sử dụng các thư viện bên ngoài (ví dụ NumPy) hoặc nếu bạn muốn giữ nguyên Python mà không phụ thuộc.
Câu hỏi bạn cần tự hỏi mình là: Bạn có muốn
- các chỉ số sẽ sắp xếp mảng / danh sách
- các chỉ số mà các phần tử sẽ có trong mảng / danh sách được sắp xếp
Thật không may, ví dụ trong câu hỏi không làm rõ điều gì là mong muốn vì cả hai sẽ cho kết quả giống nhau:
>>> arr = np.array([1, 2, 3, 100, 5])
>>> np.argsort(np.argsort(arr))
array([0, 1, 2, 4, 3], dtype=int64)
>>> np.argsort(arr)
array([0, 1, 2, 4, 3], dtype=int64)
Chọn argsort
thực hiện
Nếu bạn có NumPy theo ý của bạn, bạn chỉ cần sử dụng hàm numpy.argsort
hoặc phương thức numpy.ndarray.argsort
.
Một triển khai không có NumPy đã được đề cập trong một số câu trả lời khác, vì vậy tôi sẽ chỉ tóm tắt giải pháp nhanh nhất theo câu trả lời chuẩn ở đây
def argsort(l):
return sorted(range(len(l)), key=l.__getitem__)
Lấy các chỉ mục sẽ sắp xếp mảng / danh sách
Để có được các chỉ số sắp xếp mảng / danh sách, bạn chỉ cần gọi argsort
vào mảng hoặc danh sách. Tôi đang sử dụng các phiên bản NumPy tại đây nhưng việc triển khai Python sẽ cho kết quả tương tự
>>> arr = np.array([3, 1, 2, 4])
>>> np.argsort(arr)
array([1, 2, 0, 3], dtype=int64)
Kết quả chứa các chỉ số cần thiết để có được mảng đã sắp xếp.
Vì mảng được sắp xếp sẽ là [1, 2, 3, 4]
mảng argsort chứa các chỉ số của các phần tử này trong bản gốc.
- Giá trị nhỏ nhất là
1
và nó nằm ở chỉ mục 1
trong bản gốc nên phần tử đầu tiên của kết quả là1
.
- Là
2
tại chỉ mục 2
trong bản gốc nên yếu tố thứ hai của kết quả là 2
.
- Là
3
tại chỉ mục 0
trong bản gốc nên yếu tố thứ ba của kết quả là 0
.
- Giá trị lớn nhất
4
và nó nằm ở chỉ mục 3
trong bản gốc nên phần tử cuối cùng của kết quả là 3
.
Lấy các chỉ số mà các phần tử sẽ có trong mảng / danh sách được sắp xếp
Trong trường hợp này, bạn sẽ cần phải áp dụng argsort
hai lần :
>>> arr = np.array([3, 1, 2, 4])
>>> np.argsort(np.argsort(arr))
array([2, 0, 1, 3], dtype=int64)
Trong trường hợp này :
- phần tử đầu tiên của bản gốc là
3
giá trị lớn thứ ba để nó có chỉ mục 2
trong mảng / danh sách được sắp xếp để phần tử đầu tiên là2
.
- phần tử thứ hai của bản gốc là
1
giá trị nhỏ nhất để nó có chỉ mục 0
trong mảng / danh sách được sắp xếp để phần tử thứ hai là 0
.
- phần tử thứ ba của bản gốc là
2
giá trị nhỏ thứ hai để nó có chỉ mục 1
trong mảng / danh sách được sắp xếp để phần tử thứ ba là 1
.
- phần tử thứ tư của bản gốc là
4
giá trị lớn nhất để nó có chỉ mục 3
trong mảng / danh sách được sắp xếp để phần tử cuối cùng là 3
.