2012-06-07 13 views
7

mam matrycę NumPy które zostały uproszczone do zilustrowania:Zmiana układu Matrix Elementy z NumPy

 a b c d e f 
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]] 

gdzie liczba na „skrzyżowań” jest ważne, ale ich kolejność nie jest w porządku. Chcę ponownie ułożyć wiersze i kolumny w taki sposób, aby nowy porządek był [a, d, b, e, c, f], ale ta wartość, którą nazywam "przecięciem" jest taka sama.

Poniżej zacząłem przekształcać matrycę, jak chcę. Wypełnienie wiersza "e" wymaga spojrzenia na powyższe skrzyżowania dla (e, a) (= 4), a następnie (e, d) (= 7), a następnie (e, b) (= 5), (e, e) , (e, c) i (e, f)

 a d b e c f 
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, 

Czy ktoś może zaproponować w jaki sposób ponownie ułożyć moją macierz w ten sposób?

+0

Może to pomóc: http://stackoverflow.com/a/4857981/1142167 –

Odpowiedz

12

edit: Właśnie natknął roztworu NumPy który używa advanced indexing:

#     a b c d e f 
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]]) 

#   a d b e c f 
new_order = [0, 3, 1, 4, 2, 5] 
A1 = A[:, new_order][new_order] 

o to czysty roztwór Pythona, które mogą być przenoszone do NumPy:

#  a b c d e f 
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]] 

#   a d b e c f 
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] 

Wynik:

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

Oto wersja modyfikujący A zamiast:

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

Rzecz piękna. Osiąga dokładnie to, czego szukałem, i całkiem zwięźle. Nie rozumiem jednak "pprint.pprint". Twoje komentarze sprawiły, że odpowiedź była jeszcze łatwiejsza do odczytania. Jako newb, doceniam to. – emmagras

+0

@wagras - ['pprint'] (http://docs.python.org/library/pprint.html) to moduł do" ładnego drukowania "danych, jest to prosty sposób drukowania tablic i słowników w tym format wiersza/kolumny, zamiast tylko w jednym wierszu. –

+0

@wagras - Jeśli nie widzisz mojej edycji, znalazłem bardziej zwięzłe rozwiązanie dla NumPy. –

Powiązane problemy