Numpy 数组排列所有元素

use*_*336 2 python arrays numpy ranking

我有一个二维 numpy 数组,我想知道如何创建一个新的二维 numpy 数组来表示基于原始二维数组中所有项目的值的排名。

我想使用以下数组:

anArray = [[ 18.5,  25.9,   7.4,  11.1,  11.1]
           [ 33.3,  37. ,  14.8,  22.2,  25.9]
           [ 29.6,  29.6,  11.1,  14.8,  11.1]
           [ 25.9,  25.9,  14.8,  14.8,  11.1]
           [ 29.6,  25.9,  14.8,  11.1,   7.4]]
Run Code Online (Sandbox Code Playgroud)

创建一个新的排序数组[基于所有值并且对多个数字具有相同的等级]:

anOrder = [[ 6,  4,  9,  8,  8]
           [ 2,  1,  7,  5,  4]
           [ 3,  3,  8,  7,  8]
           [ 4,  4,  7,  7,  8]
           [ 3,  4,  7,  8,  9]]
Run Code Online (Sandbox Code Playgroud)

谢谢你。

War*_*ser 5

您可以scipy.stats.rankdatamethod='dense'. 它对扁平化输入的值进行排名,因此您必须恢复由rankdata.

例如,

In [21]: anArray
Out[21]: 
[[18.5, 25.9, 7.4, 11.1, 11.1],
 [33.3, 37.0, 14.8, 22.2, 25.9],
 [29.6, 29.6, 11.1, 14.8, 11.1],
 [25.9, 25.9, 14.8, 14.8, 11.1],
 [29.6, 25.9, 14.8, 11.1, 7.4]]

In [22]: a = np.array(anArray)

In [23]: r = rankdata(a, method='dense').reshape(a.shape)

In [24]: ranks = (r.max()+1) - r

In [25]: ranks
Out[25]: 
array([[6, 4, 9, 8, 8],
       [2, 1, 7, 5, 4],
       [3, 3, 8, 7, 8],
       [4, 4, 7, 7, 8],
       [3, 4, 7, 8, 9]])
Run Code Online (Sandbox Code Playgroud)

请注意,rankdata排名从低到高,从 0 开始,因此排名r颠倒并设置为从 1 开始的行ranks = (r.max()+1) - r