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

8 投票
2 回答
17282 浏览
提问于 2025-04-18 10:31

我在想,怎样才能根据一个数组中某一列的值来对整个数组进行排序。

我有:

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

其实你不需要用numpy来完成这个操作;(不过如果你已经在用numpy的话,可以直接用数组类的.transpose()方法。)

简单来说,这个操作是把你的数组进行转置,变成array[column][row]的形式。接着,它会把每一列和你提供的排序键(sortKeys)配对,形成一个个的元组(就是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
16

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

撰写回答