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.argsorthoặ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 argsortvà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à
1và nó nằm ở chỉ mục 1trong bản gốc nên phần tử đầu tiên của kết quả là1 .
- Là
2tại chỉ mục 2trong bản gốc nên yếu tố thứ hai của kết quả là 2.
- Là
3tại chỉ mục 0trong bản gốc nên yếu tố thứ ba của kết quả là 0.
- Giá trị lớn nhất
4và nó nằm ở chỉ mục 3trong 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à
3giá trị lớn thứ ba để nó có chỉ mục 2trong 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à
1giá trị nhỏ nhất để nó có chỉ mục 0trong 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à
2giá trị nhỏ thứ hai để nó có chỉ mục 1trong 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à
4giá trị lớn nhất để nó có chỉ mục 3trong mảng / danh sách được sắp xếp để phần tử cuối cùng là 3.