Reorganizar los elementos de la matriz con Numpy

Tengo una matriz NumPy que he simplificado para ejemplificar:

abcdef A = [[0, 1, 2, 3, 4, 5], b [1, 0, 3, 4, 5, 6], c [2, 3, 0, 5, 6, 7], d [3, 4, 5, 0, 7, 8], e [4, 5, 6, 7, 0, 9], f [5, 6, 7, 8, 9, 0]] 

donde el número en las “intersecciones” es importante, pero su orden no es correcto. Quiero reorganizar las filas y columnas de modo que el nuevo orden sea [a, d, b, e, c, f] pero este valor que estoy llamando “la intersección” es el mismo.

A continuación he empezado a transformar la matriz como quiero. Llenar la fila ‘e’ implica mirar las intersecciones anteriores para (e, a) (= 4), luego (e, d) (= 7), luego (e, b) (= 5), (e, e) , (e, c), y (e, f)

  adbecf A1= [[0, 3, 1, 4, 2, 5], d [3, 0, 4, 7, 5, 8], b [1, 4, 0, 5, 3, 6], e [4, 7, 5, 

¿Puede alguien sugerir cómo reorganizar mi matriz de esta manera?

edición: acabo de encontrar una solución NumPy que usa indexación avanzada :

 # abcdef A = numpy.array([[0, 1, 2, 3, 4, 5], [1, 0, 3, 4, 5, 6], [2, 3, 0, 5, 6, 7], [3, 4, 5, 0, 7, 8], [4, 5, 6, 7, 0, 9], [5, 6, 7, 8, 9, 0]]) # adbecf new_order = [0, 3, 1, 4, 2, 5] A1 = A[:, new_order][new_order] 

Aquí hay una solución Python pura que puede ser transferible a NumPy:

 # abcdef A = [[0, 1, 2, 3, 4, 5], [1, 0, 3, 4, 5, 6], [2, 3, 0, 5, 6, 7], [3, 4, 5, 0, 7, 8], [4, 5, 6, 7, 0, 9], [5, 6, 7, 8, 9, 0]] # adbecf new_order = [0, 3, 1, 4, 2, 5] # maps previous index to new index A1 = [[A[i][j] for j in new_order] for i in new_order] 

Resultado:

 >>> pprint.pprint(A1) [[0, 3, 1, 4, 2, 5], [3, 0, 4, 7, 5, 8], [1, 4, 0, 5, 3, 6], [4, 7, 5, 0, 6, 9], [2, 5, 3, 6, 0, 7], [5, 8, 6, 9, 7, 0]] 

Aquí hay una versión que modifica A en su lugar:

 A[:] = [A[i] for i in new_order] for row in A: row[:] = [row[i] for i in new_order] 

Numpy proporciona muchos métodos para manipular matrices, incluyendo elementos rodantes a lo largo de un xis , rodando todos los ejes , intercambiando ejes . Puedes usar una combinación de estos para obtener el orden de elementos deseado