您可以使用np.lexsort:
numpy.lexsort(键,轴=-1)
使用一系列键执行间接排序。
给定多个排序键(可以解释为电子表格中的列),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
,则最后一个键是主键。倒数第二个键是第二个键,依此类推。
np.lexsort
如上所示使用需要使用临时数组,因为它np.lexsort
不适用于 numpy 矩阵。由于
temp = data.view(np.ndarray)
创建的是视图,而不是 的副本data
,因此它不需要太多额外的内存。然而,
temp[np.lexsort((temp[:, 1], ))]
是一个新数组,它确实需要更多内存。
还有一种方法可以就地按列排序。这个想法是将数组视为具有两列的结构化数组。与普通的 ndarray 不同,结构化数组有一个sort
方法允许您将列指定为键:
In [65]: data.dtype
Out[65]: dtype('int32')
In [66]: temp2 = data.ravel().view('int32, int32')
In [67]: temp2.sort(order = ['f1', 'f0'])
请注意,由于temp2
是 的视图,data
因此不需要分配新内存和复制数组。此外,排序同时temp2
修改data
:
In [69]: data
Out[69]:
matrix([[1, 0],
[3, 2],
[5, 4],
[7, 6],
[9, 8]])