按特定列(具有2位数字或更多数字)对Matrix排序

时间:2014-11-03 04:03:18

标签: python numpy matrix

我想按照其第一列编号的顺序对numpy矩阵进行排序(命令必须移动此列的每个元素的所有行),我尝试使用" argsort()&#34 ;命令,但是当数字大于9时,它不能很好地工作,因为它只适用于每个元素的第一个数字,例如对于下面的numpy矩阵:

1.1 ....... ........ .......
1.2 ....... ........ .......
1.3 ....... ........ .......
2.1 ....... ........ .......
2.2 ....... ........ .......
2.3 ....... ........ .......
3.1 ....... ........ .......
3.2 ....... ........ .......
3.3 ....... ........ .......
6.1 ....... ........ .......
6.2 ....... ........ .......
6.3 ....... ........ .......
8.1 ....... ........ .......
8.2 ....... ........ .......
8.3 ....... ........ .......
5.1 ....... ........ .......
5.2 ....... ........ .......
5.3 ....... ........ .......
4.1 ....... ........ .......
4.2 ....... ........ .......
4.3 ....... ........ .......
12.1 ....... ........ .......
12.2 ....... ........ .......
12.3 ....... ........ .......
11.1 ....... ........ .......
11.2 ....... ........ .......
11.3 ....... ........ .......
10.1 ....... ........ .......
10.2 ....... ........ .......
10.3 ....... ........ .......
9.1 ....... ........ .......
9.2 ....... ........ .......
9.3 ....... ........ .......
7.1 ....... ........ .......
7.2 ....... ........ .......

cjarray.sort=cjarray[cjarray[:, 0].argsort()]

1.1 ....... ........ ....... 
1.2 ....... ........ ....... 
1.3 ....... ........ ....... 
10.1 ....... ........ ....... 
10.2 ....... ........ ....... 
10.3 ....... ........ ....... 
11.1 ....... ........ ....... 
11.2 ....... ........ ....... 
11.3 ....... ........ ....... 
12.1 ....... ........ ....... 
12.2 ....... ........ ....... 
12.3 ....... ........ ....... 
2.1 ....... ........ ....... 
2.2 ....... ........ ....... 
2.3 ....... ........ ....... 
3.1 ....... ........ ....... 
3.2 ....... ........ ....... 
3.3 ....... ........ ....... 
4.1 ....... ........ ....... 
4.2 ....... ........ ....... 
4.3 ....... ........ ....... 
5.1 ....... ........ ....... 
5.2 ....... ........ ....... 
5.3 ....... ........ ....... 
6.1 ....... ........ ....... 
6.2 ....... ........ ....... 
6.3 ....... ........ ....... 
7.1 ....... ........ ....... 
7.2 ....... ........ ....... 
7.3 ....... ........ ....... 
8.1 ....... ........ ....... 
8.2 ....... ........ ....... 
8.3 ....... ........ ....... 
9.1 ....... ........ ....... 
9.2 ....... ........ ....... 

正如你所看到的,矩阵从1.3跳到10.1,因为命令只关心第一个数字,有人可以伸出援手。

非常感谢!

2 个答案:

答案 0 :(得分:1)

您应该argsort()仅列出您想要排序矩阵的列,并使用生成的索引排序矩阵。演示:

>>> a=np.array([[12,2,3,4],[22,1,3,5],[4,1,6,7],[15,1,2,7]])
>>> a
array([[12,  2,  3,  4],
       [22,  1,  3,  5],
       [ 4,  1,  6,  7],
       [15,  1,  2,  7]])
>>> a[a[:,0].argsort()]
array([[ 4,  1,  6,  7],
       [12,  2,  3,  4],
       [15,  1,  2,  7],
       [22,  1,  3,  5]])

答案 1 :(得分:0)

这是我用了很长时间来模拟MATLAB sortrows的原因。 Tbh .argsort似乎更有吸引力,应该可以正常工作。几年前它无法使用。

def sortrows(data):
    """assumes data to be numpy.ndarray"""
    data = np.ascontinuousarray(data)
    return np.sort(
        data.view(['', data.dtype] * data.shape[1]), axis=0
    ).view(data.dtype)