2012-08-22 26 views
5

Köşelerdeki köşelere sahip olması gereken bir matrisim var ama sütunlar karıştı.Diyagonal bir matrisi köşegenine göre sırala

Messed up matrix

Ama döngü için bariz olmadan verimli bir köşegenleri birlik olsun satırları verişi nasıl bilmiyorum. Sıralamak için hangi anahtarın geçeceğinden bile emin değilim.

Herhangi bir öneriniz var mı?

+2

Şamandıralar, bunların kolonlarında tam olarak 1.0 ve eşsiz olduklarını garanti edebilir misiniz? – wim

+0

@wim: Kayan nokta hatası sorunu var. Ancak, köşegen boyunca her giriş, bu satırda en yüksek değere sahip olacak şekilde garanti edilir. – mac389

cevap

6

Sen hedef sütunu sırasını belirlemek ve sütun indisleri olarak argmax sonuçları kullanarak matris yeniden düzenlemek için numpy en argmax kullanabilirsiniz:., Çünkü bunlar,

>>> 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

Çok hoş. 1000x1000 dizisi için, sizinki 0.1s çalışır ve benim 10s çalışır. – 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. ]]) 

Aslında sütunlara değil satırlara göre sıralar (ancak sonuç aynıdır). Bu 1 içinde bulunduğu sütunun dizine göre sıralayarak çalışır

+0

Standart kütüphane tekrar kazanır. Numpy listesi kullanmadan bunu yapmanın herhangi bir yolu var mı? Bunun büyük bir dizi için oldukça yavaş olduğunu hayal edebiliyorum. – jozzas

+0

@jozzas: Aslında hiç uyuşmuyor. 'Np.array' parçalarını çıkarırsanız iyi çalışır. – Snowball

+0

Üzgünüz, python listelerini kastediyorum. Yalnız bir çözüm var mı? – jozzas