Cette question date de quelques années et la réponse acceptée est excellente, mais je pense que ce qui suit mérite d'être mentionné. Si cela ne vous dérange pas de la dépendance scipy
, vous pouvez utiliser 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])
Une fonctionnalité intéressante de rankdata
est que l' method
argument offre plusieurs options pour gérer les liens. Par exemple, il y a trois occurrences de 20 et deux occurrences de 40 dans b
:
In [26]: b = [40, 20, 70, 10, 20, 50, 30, 40, 20]
La valeur par défaut attribue le rang moyen aux valeurs liées:
In [27]: rankdata(b)
Out[27]: array([ 6.5, 3. , 9. , 1. , 3. , 8. , 5. , 6.5, 3. ])
method='ordinal'
attribue des rangs consécutifs:
In [28]: rankdata(b, method='ordinal')
Out[28]: array([6, 2, 9, 1, 3, 8, 5, 7, 4])
method='min'
affecte le rang minimum des valeurs liées à toutes les valeurs liées:
In [29]: rankdata(b, method='min')
Out[29]: array([6, 2, 9, 1, 2, 8, 5, 6, 2])
Voir la docstring pour plus d'options.
ranks = temp.argsort()
.