按列对python数组/recarray进行排序

Posted

技术标签:

【中文标题】按列对python数组/recarray进行排序【英文标题】:Sorting a python array/recarray by column 【发布时间】:2011-10-13 17:06:56 【问题描述】:

关于如何按给定列对整个数组/recarray 进行排序,我有一个相当简单的问题。例如,给定数组:

import numpy as np
data = np.array([[5,2], [4,1], [3,6]])

我想按要返回的第一列对数据进行排序:

array([[3,6], [4,1], [5,2]])

【问题讨论】:

【参考方案1】:

使用data[np.argsort(data[:, 0])],其中0 是要排序的列索引:

In [27]: import numpy as np

In [28]: data = np.array([[5,2], [4,1], [3,6]])

In [29]: col = 0

In [30]: data=data[np.argsort(data[:,col])]
Out[30]: 
array([[3, 6],
       [4, 1],
       [5, 2]])

【讨论】:

如何调整它以按多列排序(一列优先级更高)?【参考方案2】:

您正在寻找operator.itemgetter

>>> from operator import itemgetter, attrgetter

>>> sorted(student_tuples, key=itemgetter(2))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

>>> sorted(student_objects, key=attrgetter('age'))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

In [7]: a
Out[7]: [[5, 2], [4, 1], [3, 6]]

In [8]: sorted(a, key=operator.itemgetter(0))
Out[8]: [[3, 6], [4, 1], [5, 2]]

【讨论】:

【参考方案3】:

要对第二列进行排序,请使用itemgetter

>>> from operator import itemgetter
>>> data = [[5,2], [4,1], [3,6]]
>>> sorted(data)
[[3, 6], [4, 1], [5, 2]]
>>> sorted(data,key=itemgetter(1))
[[4, 1], [5, 2], [3, 6]]
>>> 

【讨论】:

【参考方案4】:

这有点棘手:

data[data[:,0].argsort()]

# data[:,n] -- get entire column of index n
# argsort() -- get the indices that would sort it
# data[data[:,n].argsort()] -- get data array sorted by n-th column

我在这里找到了这个食谱:

http://www.scipy.org/NumPy_for_Matlab_Users

http://mathesaurus.sourceforge.net/matlab-numpy.html

【讨论】:

【参考方案5】:

这是一个适用于切片的扩展:

import numpy as np
x = np.array([[9, 1, 2],
              [5, 3, 4],
              [0, 5, 6]])

按行排序:

x[:, x[1,:].argsort()] # Sort by second row

array([[1, 2, 9]
       [3, 4, 5]
       [5, 6, 0]])

按列排序:

x[x[:,0].argsort(), :] # Sort by first column

array([[0, 5, 6],
       [5, 3, 4],
       [9, 1, 2]])

【讨论】:

我可以使用 argsort() 以类似的方式按降序对所有矩阵列进行排序吗?

以上是关于按列对python数组/recarray进行排序的主要内容,如果未能解决你的问题,请参考以下文章

在C#中按列对二维数组进行排序

如何按列对二维数组(锯齿状)进行排序[重复]

按列对csv进行排序

在遵循特定结构的同时按列对多索引进行排序

python Pandas - 按列对DataFrame排序

按列对 csv 文件进行排序