Pertanyaan ini sudah berumur beberapa tahun, dan jawaban yang diterima bagus, tetapi saya pikir yang berikut ini masih layak untuk disebutkan. Jika Anda tidak keberatan dengan ketergantungan ini scipy, Anda dapat menggunakan 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])
Fitur yang bagus rankdataadalah bahwa methodargumen menyediakan beberapa opsi untuk menangani hubungan. Misalnya, ada tiga kemunculan 20 dan dua kemunculan 40 di b:
In [26]: b = [40, 20, 70, 10, 20, 50, 30, 40, 20]
Default memberikan peringkat rata-rata ke nilai terikat:
In [27]: rankdata(b)
Out[27]: array([ 6.5, 3. , 9. , 1. , 3. , 8. , 5. , 6.5, 3. ])
method='ordinal' memberikan peringkat berturut-turut:
In [28]: rankdata(b, method='ordinal')
Out[28]: array([6, 2, 9, 1, 3, 8, 5, 7, 4])
method='min' memberikan peringkat minimum dari nilai terikat ke semua nilai terikat:
In [29]: rankdata(b, method='min')
Out[29]: array([6, 2, 9, 1, 2, 8, 5, 6, 2])
Lihat docstring untuk opsi lebih lanjut.
ranks = temp.argsort().