यह प्रश्न कुछ साल पुराना है, और स्वीकृत उत्तर बहुत अच्छा है, लेकिन मुझे लगता है कि निम्नलिखित अभी भी ध्यान देने योग्य है। यदि आप पर निर्भरता को बुरा नहीं मानते हैं scipy
, तो आप इसका उपयोग कर सकते हैं 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])
इसकी एक अच्छी विशेषता rankdata
यह है कि method
तर्क संबंधों को संभालने के लिए कई विकल्प प्रदान करता है। उदाहरण के लिए, 20 की तीन घटनाएं और 40 की दो घटनाएं हैं b
:
In [26]: b = [40, 20, 70, 10, 20, 50, 30, 40, 20]
डिफ़ॉल्ट बंधे मूल्यों के लिए औसत रैंक प्रदान करता है:
In [27]: rankdata(b)
Out[27]: array([ 6.5, 3. , 9. , 1. , 3. , 8. , 5. , 6.5, 3. ])
method='ordinal'
लगातार रैंक प्रदान करता है:
In [28]: rankdata(b, method='ordinal')
Out[28]: array([6, 2, 9, 1, 3, 8, 5, 7, 4])
method='min'
सभी बंधे मूल्यों के लिए बंधे हुए मूल्यों की न्यूनतम रैंक प्रदान करता है:
In [29]: rankdata(b, method='min')
Out[29]: array([6, 2, 9, 1, 2, 8, 5, 6, 2])
अधिक विकल्पों के लिए docstring देखें।
ranks = temp.argsort()
।