2012-08-22 35 views
5

Tengo una matriz que debe tener unos en la diagonal, pero las columnas están mezcladas.Ordenar una matriz numpy en función de su diagonal

Messed up matrix

Pero no sé cómo, sin la obvia para el lazo, para intercambiar eficientemente filas para conseguir la unidad en las diagonales. Ni siquiera estoy seguro de qué clave pasaría para ordenar.

¿Alguna sugerencia?

+2

ya que flotas, ¿puedes garantizar que son exactamente 1.0 y únicas en sus columnas? – wim

+0

@wim: Existe el problema del error de coma flotante. Pero, se garantiza que cada entrada a lo largo de la diagonal tendrá el valor más alto en esa fila. – mac389

Respuesta

6

Puede utilizar numpy de argmax para determinar el orden de la columna meta y reordenar su matriz utilizando los resultados argmax como los índices de columna:.

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

Muy agradable. Para una matriz de 1000x1000, la suya se ejecuta en 0.1s y la mía se ejecuta en 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. ]]) 

Realmente ordena por filas, no por columnas (pero el resultado es el mismo). Funciona mediante la clasificación por el índice de la columna de 1 está en

+0

La biblioteca estándar gana de nuevo. ¿Alguna forma de hacer esto sin tener que usar listas numpy? Me imagino que esto es bastante lento para una gran variedad. – jozzas

+0

@jozzas: en realidad no se basa en numpy en absoluto. Funcionará bien si sacas las partes 'np.array'. – Snowball

+0

Lo siento, quise decir las listas de Python. ¿Hay una solución solo numpy? – jozzas

Cuestiones relacionadas