【问题标题】:How to sort a numpy array based on the values in a specific row?如何根据特定行中的值对 numpy 数组进行排序?
【发布时间】:2014-08-11 11:08:38
【问题描述】:

我想知道如何通过其中一列中的值对整个数组进行排序。

我有:

array([5,2,8,2,4])

和:

array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])

我想像这样将第一个数组附加到第二个数组:

array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24],
       [5,  2,  8,  2,  4]])

然后按附加的行对数组进行排序以获得以下任一结果:

array([[1,  3,  4,  0,  2],
       [6,  8,  9,  5,  7],
       [11, 13, 14, 10, 12],
       [16, 18, 19, 15, 17],
       [21, 23, 24, 20, 22],
       [2,  2,  4,  5,  8]])

或者这个:

array([[ 2,  1,  3,  4,  0],
       [ 7,  6,  8,  9,  5],
       [12, 11, 13, 14, 10],
       [17, 16, 18, 19, 15],
       [22, 21, 23, 24, 20],
       [ 8,  5,  4,  2,  2]])

然后去掉附加列得到:

array([[1,  3,  4,  0,  2],
       [6,  8,  9,  5,  7],
       [11, 13, 14, 10, 12],
       [16, 18, 19, 15, 17],
       [21, 23, 24, 20, 22]])

或:

array([[ 2,  1,  3,  4,  0],
       [ 7,  6,  8,  9,  5],
       [12, 11, 13, 14, 10],
       [17, 16, 18, 19, 15],
       [22, 21, 23, 24, 20]])

是否有执行此程序的代码。我对python很陌生。非常感谢!

【问题讨论】:

    标签: python arrays sorting numpy


    【解决方案1】:

    您可以使用numpy.argsort 获取包含数组排序索引的列表。然后,您可以使用它重新排列矩阵的列。

    import numpy as np
    
    c = np.array([5,2,8,2,4])    
    a = np.array([[ 0,  1,  2,  3,  4],
                  [ 5,  6,  7,  8,  9],
                  [10, 11, 12, 13, 14],
                  [15, 16, 17, 18, 19],
                  [20, 21, 22, 23, 24]])
    
    i = np.argsort(c)
    a = a[:,i]
    

    【讨论】:

    • 谢谢,它就像魔术一样!您是否碰巧知道它是如何工作的,因为我似乎无法从代码和文档中弄清楚它?谢谢!
    • argsort 返回一个对数组进行排序的索引数组。 i 中的第一个元素是c 中具有最低值的位置,等等。您可以使用列表来索引numpy 数组,因此c[i] 将为您提供c 的排序版本。将其扩展到二维数组,您可以使用列表来选择一堆行或(在这种情况下)列。您希望列按i 指定的顺序排列,但您希望所有行都保持不变,因此:(这是一个覆盖所有行的切片)。您应该在 numpy 中找到有关切片和索引的教程,因为它确实是必不可少的东西。
    【解决方案2】:

    您不需要 numpy 来执行此操作; (虽然如果你使用的是 numpy,你可以只使用数组类的.transpose() 方法。

    这实质上是转置您的数组,使其成为array[column][row],然后获取每一列,并将它们与您在元组列表中提供的排序键(zip(sortKeys, a) 位)配对。然后它对这个元组列表进行排序。默认情况下,根据元组的第一个值、第二个值、第三个值等对排序元组进行排序。现在列已按顺序排列。

    然后aNew = [...] 只是提取列并创建新数组,仍然采用array[column][row] 格式,然后再次转置。

    a = [[ 0,  1,  2,  3,  4],
         [ 5,  6,  7,  8,  9],
         [10, 11, 12, 13, 14],
         [15, 16, 17, 18, 19],
         [20, 21, 22, 23, 24]]
    
    #transpose a
    a = zip(*a)
    
    sortKeys = [5,2,8,2,4]
    
    b = zip(sortKeys, a)
    
    aNew = [row[1] for row in sorted(b)]
    
    #transpose a back
    aNew = zip(*aNew)
    
    print aNew
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-10
      • 2013-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-08
      • 1970-01-01
      相关资源
      最近更新 更多