通过一列进行Python Matrix排序

时间:2012-11-12 03:42:49

标签: python sorting matrix numpy

我有一个 n x 2 整数矩阵。第一列是一系列0,1,-1,2,-2,但是它们是按照它们的组成矩阵编译的顺序。第二列是另一个列表中的索引列表。

我想通过第二列对矩阵进行排序。这相当于在Excel中选择两列数据,并通过B列进行排序(数据在A和B列中)。请记住,每行第一列中的相邻数据应与其相应的第二列对应数据保持一致。我使用以下方法查看了解决方案:

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

但这似乎不起作用。有问题的矩阵如下所示:

matrix([[1, 1],
        [1, 3],
        [1, 7],
        ..., 
        [2, 1021],
        [2, 1040],
        [2, 1052]])

2 个答案:

答案 0 :(得分:3)

您可以使用np.lexsort

  

numpy.lexsort(keys,axis = -1)

     

使用一系列键进行间接排序。

     

给定多个排序键,可以将其解释为a中的列   电子表格,lexsort返回一个整数索引数组   按多列描述排序顺序。


In [13]: data = np.matrix(np.arange(10)[::-1].reshape(-1,2))

In [14]: data
Out[14]: 
matrix([[9, 8],
        [7, 6],
        [5, 4],
        [3, 2],
        [1, 0]])

In [15]: temp = data.view(np.ndarray)

In [16]: np.lexsort((temp[:, 1], ))
Out[16]: array([4, 3, 2, 1, 0])

In [17]: temp[np.lexsort((temp[:, 1], ))]
Out[17]: 
array([[1, 0],
       [3, 2],
       [5, 4],
       [7, 6],
       [9, 8]])

请注意,如果您将多个密钥传递给np.lexsort,则 last 密钥是主密钥。倒数第二个键是第二个键,依此类推。


如上所示,使用np.lexsort需要使用临时数组,因为np.lexsort不适用于numpy矩阵。以来 temp = data.view(np.ndarray)创建一个视图,而不是data的副本,它不需要太多额外的内存。但是,

temp[np.lexsort((temp[:, 1], ))]

是一个新数组,需要更多内存。

还有一种方法可以按列就地进行排序。我们的想法是将数组视为具有两列的结构化数组。与普通的ndarrays不同,结构化数组有一个sort方法,允许您将列指定为键:

In [65]: data.dtype
Out[65]: dtype('int32')

In [66]: temp2 = data.ravel().view('int32, int32')

In [67]: temp2.sort(order = ['f1', 'f0'])

请注意,由于temp2data视图,因此不需要分配新内存并复制数组。此外,排序temp2会同时修改data

In [69]: data
Out[69]: 
matrix([[1, 0],
        [3, 2],
        [5, 4],
        [7, 6],
        [9, 8]])

答案 1 :(得分:1)

你有正确的想法,仅仅是几个字符:

>>> import numpy as np
>>> data = np.matrix([[9, 8],
...                   [7, 6],
...                   [5, 4],
...                   [3, 2],
...                   [1, 0]])
>>> data[np.argsort(data.A[:, 1])]
matrix([[1, 0],
        [3, 2],
        [5, 4],
        [7, 6],
        [9, 8]])