如何根据特定行中的值对 numpy 数组进行排序?
Posted
技术标签:
【中文标题】如何根据特定行中的值对 numpy 数组进行排序?【英文标题】:How to sort a numpy array based on the values in a specific row? 【发布时间】: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很陌生。非常感谢!
【问题讨论】:
【参考方案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
【讨论】:
以上是关于如何根据特定行中的值对 numpy 数组进行排序?的主要内容,如果未能解决你的问题,请参考以下文章