2012-08-22 37 views
5

我有一個矩陣,它應該在對角線上有一個矩陣,但列是混合起來的。根據其對角線排列一個numpy矩陣

Messed up matrix

但我不知道怎麼回事,沒有明顯的循環,有效地互換行以獲得在對角線上的統一。我甚至不知道我會通過什麼樣的關鍵排序。

有什麼建議嗎?

+2

因爲他們'重新漂浮,你能保證他們的列正好是1.0和唯一的嗎? – wim

+0

@wim:存在浮點錯誤的問題。但是,沿着對角線的每個條目都保證在該行中具有最高值。 – mac389

回答

6

您可以使用numpy的的argmax確定了球門立柱訂購和使用argmax結果列索引重新排列矩陣:

>>> z = numpy.array([[ 0.1 , 0.1 , 1. ], 
...     [ 1. , 0.1 , 0.09], 
...     [ 0.1 , 1. , 0.2 ]]) 

numpy.argmax(z, axis=1) 

>>> array([2, 0, 1]) #Goal column indices 

z[:,numpy.argmax(z, axis=1)] 

>>> array([[ 1. , 0.1 , 0.1 ], 
...  [ 0.09, 1. , 0.1 ], 
...  [ 0.2 , 0.1 , 1. ]]) 
+0

非常好。對於1000x1000陣列,您的運行時間爲0.1s,我的運行時間爲10s。 – Snowball

3
>>> import numpy as np 
>>> a = np.array([[ 1. , 0.5, 0.5, 0. ], 
...    [ 0.5, 0.5, 1. , 0. ], 
...    [ 0. , 1. , 0. , 0.5], 
...    [ 0. , 0.5, 0.5, 1. ]]) 
>>> np.array(sorted(a, cmp=lambda x, y: list(x).index(1) - list(y).index(1))) 
array([[ 1. , 0.5, 0.5, 0. ], 
     [ 0. , 1. , 0. , 0.5], 
     [ 0.5, 0.5, 1. , 0. ], 
     [ 0. , 0.5, 0.5, 1. ]]) 

它實際上按行排序,而不是列(但結果是相同的)。它的工作原理是由列的1是指數排序

+0

標準庫再次獲勝。任何方式來做到這一點,而不必使用numpy列表?我可以想象這對於大型陣列來說相當緩慢。 – jozzas

+0

@jozzas:它實際上並不依賴於numpy。如果你拿出'np.array'部件,它會工作得很好。 – Snowball

+0

對不起,我的意思是Python列表。是否有一個只有numpy的解決方案? – jozzas