如何根据特定行的值对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
其实你不需要用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]