Câu hỏi này đã có từ vài năm trước, và câu trả lời được chấp nhận là tuyệt vời, nhưng tôi nghĩ những điều sau đây vẫn đáng nói. Nếu bạn không ngại phụ thuộc vào scipy
, bạn có thể sử dụng scipy.stats.rankdata
:
In [22]: from scipy.stats import rankdata
In [23]: a = [4, 2, 7, 1]
In [24]: rankdata(a)
Out[24]: array([ 3., 2., 4., 1.])
In [25]: (rankdata(a) - 1).astype(int)
Out[25]: array([2, 1, 3, 0])
Một tính năng hay rankdata
là method
đối số cung cấp một số tùy chọn để xử lý các mối quan hệ. Ví dụ: có ba lần xuất hiện 20 và hai lần xuất hiện 40 trong b
:
In [26]: b = [40, 20, 70, 10, 20, 50, 30, 40, 20]
Mặc định chỉ định thứ hạng trung bình cho các giá trị ràng buộc:
In [27]: rankdata(b)
Out[27]: array([ 6.5, 3. , 9. , 1. , 3. , 8. , 5. , 6.5, 3. ])
method='ordinal'
xếp các cấp bậc liên tiếp:
In [28]: rankdata(b, method='ordinal')
Out[28]: array([6, 2, 9, 1, 3, 8, 5, 7, 4])
method='min'
chỉ định thứ hạng tối thiểu của các giá trị được ràng buộc cho tất cả các giá trị được ràng buộc:
In [29]: rankdata(b, method='min')
Out[29]: array([6, 2, 9, 1, 2, 8, 5, 6, 2])
Xem docstring để có thêm tùy chọn.
ranks = temp.argsort()
.