2016-05-29 28 views
0

这似乎被问了很多次,但是我发现现在不适用的答案。让我们简单的,在这里我有一个numpy的矩阵按目标列对numpy矩阵中的所有行进行排序

data = np.matrix([[9, 8], 
      [7, 6], 
      [5, 7], 
      [3, 2], 
      [1, 0]]) 

然后排序第二列如下

[[1, 0], 
[3, 2], 
[7, 6], 
[5, 7], 
[9, 8]])   

我尝试了很多的例子一样Python Matrix sorting via one column但他们没有工作。

我想知道也许是因为答案是多年前发布的,不适用于最新的Python?我的Python是3.5.1。我的失败试验

例子:

data = np.matrix([[9, 8], 
      [7, 6], 
      [5, 7], 
      [3, 2], 
      [1, 0]]) 
temp = data.view(np.ndarray) 
np.lexsort((temp[:, 1],)) 

print(temp) 
print(data) 
+2

“不工作”是什么意思,哪个代码完全被试过,你知道np.matrix!= np.array? (我真的真的不认为,如果他们使用基本的numpy东西,这些其他答案是过时的;这会因为很多原因杀死numpy!) – sascha

+0

在对你的问题再次看一眼:你的标题** Sorting numpy矩阵逐列**是误导。第一个链接中的**工作**例子就是这样做的,但根据您的示例,您只需要对矩阵内的列进行排序(而不重新排列相应的其他列)! – sascha

+0

@sascha你说得对,所以我删除了我的第二个链接。 “不工作”是指批准的答案不会对我的矩阵进行排序。我在那里举了一个例子。 – Windtalker

回答

4

你是一个移动的目标。

排序每一列独立地为:

In [151]: np.sort(data,axis=0) 
Out[151]: 
matrix([[1, 0], 
     [3, 2], 
     [5, 6], 
     [7, 7], 
     [9, 8]]) 

排序上的第二列

In [160]: ind=np.argsort(data[:,1],axis=0) 

In [161]: ind 
Out[161]: 
matrix([[4], 
     [3], 
     [1], 
     [2], 
     [0]], dtype=int32) 

In [162]: data[ind.ravel(),:] # ravel needed because of matrix 
Out[162]: 
matrix([[[1, 0], 
     [3, 2], 
     [7, 6], 
     [5, 7], 
     [9, 8]]]) 

另一种方式来获得一个有效ind数组的值:

In [163]: ind=np.argsort(data.A[:,1],axis=0) 

In [164]: ind 
Out[164]: array([4, 3, 1, 2, 0], dtype=int32) 

In [165]: data[ind,:] 

要使用lexsort你需要类似

In [175]: np.lexsort([data.A[:,0],data.A[:,1]]) 
Out[175]: array([4, 3, 1, 2, 0], dtype=int32) 

或你的 '失败' 的情况下 - 这是不是一个失败

In [178]: np.lexsort((data.A[:,1],)) 
Out[178]: array([4, 3, 1, 2, 0], dtype=int32) 

这里data[:,1]是主键。 data[:,0]是联络断路器(在您的示例中不适用)。我只是从文档工作。

+0

通过所有的提示,非常感谢您的帮助! – Windtalker

1

在您的链接的方式工作:

import numpy as np 

data = np.matrix([[9, 8], 
     [7, 6], 
     [5, 7], 
     [3, 2], 
     [1, 0]]) 

print(data[np.argsort(data.A[:, 1])]) 

[[1 0] 
[3 2] 
[7 6] 
[5 7] 
[9 8]] 

现在的例子是更好地看到:

data = np.matrix([[1, 9], 
     [2, 8], 
     [3, 7], 
     [4, 6], 
     [0, 5]]) 
[[0 5] 
[4 6] 
[3 7] 
[2 8] 
[1 9]] 
+0

Sascha,我非常感谢您的帮助和耐心。我在第一篇文章中犯了很多错误。最大的错误是我被矩阵和ndarray困惑。无论如何,再次感谢。解决了我的问题 – Windtalker

+0

无后顾之忧。蟒蛇和numpy玩得开心!您也应该接受@ hpaulj的答案,因为它非常详细,可以解决您的问题!看看StackOverflows的帮助,看看为什么你不需要标题中的任何“已解决”。您只需将一个答案标记为**接受**即可。 – sascha

+0

刚刚标记。那么如果可能的话,我想标记你们两个 – Windtalker

相关问题