如何根据特定行中的值对numpy数组进行排序?

时间:2014-06-20 16:13:50

标签: python arrays sorting numpy

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

我有:

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的新手。非常感谢!

2 个答案:

答案 0 :(得分:9)

您可以使用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]

答案 1 :(得分:0)

你不需要numpy这样做; (虽然如果你使用numpy,你可以使用数组类的.transpose()方法。

这基本上是做什么的,将你的数组转换为array[column][row],然后获取每一列,并将它们与你在元组列表中提供的sortKeys配对({{1} }位)。然后它对这个元组列表进行排序。默认情况下,根据排序元组的第一个值排序,然后排序第二个值,然后排序第三个,等等。现在按顺序排列。

然后zip(sortKeys, a)只提取列并创建新数组,仍然采用aNew = [...]格式,然后再次转置。

array[column][row]