通过一列进行Python矩阵排序
我有一个nx2的整数矩阵。第一列是一个系列0,1,-1,2,-2,但是它们是按照从组成矩阵编译而来的顺序排列的。第二列是另一个列表中的索引列表通过一列进行Python矩阵排序,python,sorting,matrix,numpy,Python,Sorting,Matrix,Numpy,我有一个nx2的整数矩阵。第一列是一个系列0,1,-1,2,-2,但是它们是按照从组成矩阵编译而来的顺序排列的。第二列是另一个列表中的索引列表 data[np.argsort(data[:, 0])] 我想通过第二列对矩阵进行排序。这相当于在Excel中选择两列数据,并通过B列进行排序(其中数据位于A列和B列)。请记住,每行第一列中的相邻数据应与其对应的第二列保持一致。我使用以下方法研究了解决方案: data[np.argsort(data[:, 0])] 但这似乎不起作用。所讨论的矩阵如下
data[np.argsort(data[:, 0])]
我想通过第二列对矩阵进行排序。这相当于在Excel中选择两列数据,并通过B列进行排序(其中数据位于A列和B列)。请记住,每行第一列中的相邻数据应与其对应的第二列保持一致。我使用以下方法研究了解决方案:
data[np.argsort(data[:, 0])]
但这似乎不起作用。所讨论的矩阵如下所示:
data[np.argsort(data[:, 0])]
matrix([[1, 1],
[1, 3],
[1, 7],
...,
[2, 1021],
[2, 1040],
[2, 1052]])
您可以使用:
data[np.argsort(data[:, 0])]
lexsort(键,轴=-1)
data[np.argsort(data[:, 0])]
使用一系列键执行间接排序
data[np.argsort(data[:, 0])]
给定多个排序键,这些排序键可以解释为
电子表格,lexsort返回一个整数索引数组
按多列描述排序顺序
data[np.argsort(data[:, 0])]
注意:如果将多个键传递给
np.lexsort
,则最后一个键是主键。倒数第二个键是第二个键,依此类推
data[np.argsort(data[:, 0])]
如上所述,使用
np.lexsort
需要使用临时数组,因为np.lexsort
不适用于numpy矩阵。自从
temp=data.view(np.ndarray)
创建一个视图,而不是数据的副本,它不需要太多额外的内存。但是,
data[np.argsort(data[:, 0])]
temp[np.lexsort((temp[:, 1], ))]
是一个新阵列,它确实需要更多内存
data[np.argsort(data[:, 0])]
还有一种方法可以按在位列进行排序。其思想是将数组视为具有两列的结构化数组。与普通Ndarray不同,结构化数组有一个排序
方法,允许您将列指定为键:
data[np.argsort(data[:, 0])]
In [65]: data.dtype
Out[65]: dtype('int32')
In [66]: temp2 = data.ravel().view('int32, int32')
In [67]: temp2.sort(order = ['f1', 'f0'])
请注意,由于temp2
是数据的视图,因此它不需要分配新内存和复制阵列。此外,排序temp2
同时修改数据
:
data[np.argsort(data[:, 0])]
In [69]: data
Out[69]:
matrix([[1, 0],
[3, 2],
[5, 4],
[7, 6],
[9, 8]])
您可以使用:
data[np.argsort(data[:, 0])]
lexsort(键,轴=-1)
data[np.argsort(data[:, 0])]
使用一系列键执行间接排序
data[np.argsort(data[:, 0])]
给定多个排序键,这些排序键可以解释为
电子表格,lexsort返回一个整数索引数组
按多列描述排序顺序
data[np.argsort(data[:, 0])]
注意:如果将多个键传递给np.lexsort
,则最后一个键是主键。倒数第二个键是第二个键,依此类推
data[np.argsort(data[:, 0])]
如上所述,使用np.lexsort
需要使用临时数组,因为np.lexsort
不适用于numpy矩阵。自从
temp=data.view(np.ndarray)
创建一个视图,而不是数据的副本,它不需要太多额外的内存。但是,
data[np.argsort(data[:, 0])]
temp[np.lexsort((temp[:, 1], ))]
是一个新阵列,它确实需要更多内存
data[np.argsort(data[:, 0])]
还有一种方法可以按在位列进行排序。其思想是将数组视为具有两列的结构化数组。与普通Ndarray不同,结构化数组有一个排序
方法,允许您将列指定为键:
data[np.argsort(data[:, 0])]
In [65]: data.dtype
Out[65]: dtype('int32')
In [66]: temp2 = data.ravel().view('int32, int32')
In [67]: temp2.sort(order = ['f1', 'f0'])
请注意,由于temp2
是数据的视图,因此它不需要分配新内存和复制阵列。此外,排序temp2
同时修改数据
:
data[np.argsort(data[:, 0])]
In [69]: data
Out[69]:
matrix([[1, 0],
[3, 2],
[5, 4],
[7, 6],
[9, 8]])
你的想法是对的,只差几个字:
data[np.argsort(data[:, 0])]
>>> 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]])
你的想法是对的,只差几个字:
data[np.argsort(data[:, 0])]
>>> 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]])
谢谢堆@unutbu你的a星!我看第二个解决方案是最好的这一个正是我想要的:)再次感谢Hanks heaps@unutbu你的a星!我认为第二种解决方案是最好的,这正是我想要的:)再次感谢Hanks使用此方法@Bi Rico;)进行澄清感谢使用此方法@Bi Rico;)进行的澄清