【问题标题】:Numpy Array Rank All ElementsNumpy Array 对所有元素进行排序
【发布时间】:2016-03-24 04:19:46
【问题描述】:

我有一个二维 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]]

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

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]]

谢谢。

【问题讨论】:

    标签: python arrays numpy ranking


    【解决方案1】:

    您可以将scipy.stats.rankdatamethod='dense' 一起使用。它对 flattened 输入的值进行排序,因此您必须恢复 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]])
    

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

    【讨论】:

      【解决方案2】:

      这是 np.unique 的例行工作,其可选参数 return_inverse 根据其他元素之间的唯一性标记每个元素,就像这样 -

      _,id = np.unique(anArray,return_inverse=True)
      out = (id.max() - id + 1).reshape(anArray.shape)
      

      示例运行 -

      In [17]: anArray
      Out[17]: 
      array([[ 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]])
      
      In [18]: _,id = np.unique(anArray,return_inverse=True)
      
      In [19]: (id.max() - id + 1).reshape(anArray.shape)
      Out[19]: 
      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]])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-29
        • 1970-01-01
        • 2017-01-06
        • 1970-01-01
        • 2013-06-10
        • 2017-04-20
        • 2019-05-13
        • 2015-08-23
        相关资源
        最近更新 更多