2016-05-29 56 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

相關問題