Chcę zmodyfikować gęstą kwadratową macierz przejścia w miejscu, zmieniając kolejność kilku jej wierszy i kolumn, używając biblioteki numpy Pythona. Matematycznie odpowiada to pomnożeniu macierzy przez macierz permutacji P i pomnożeniu jej przez P ^ -1 = P ^ T, ale nie jest to uzasadnione obliczeniowo rozwiązanie.
W tej chwili ręcznie zmieniam wiersze i kolumny, ale oczekiwałbym, że numpy będzie mieć fajną funkcję f (M, v), gdzie M ma n wierszy i kolumn, a v ma n wpisów, więc f (M, v) aktualizuje M zgodnie z permutacją indeksu v. Może po prostu nie udaje mi się przeszukać Internetu.
Coś takiego może być możliwe przy „zaawansowanym indeksowaniu” Numpy, ale rozumiem, że takie rozwiązanie nie byłoby na miejscu. Również w niektórych prostych sytuacjach może być wystarczające oddzielne śledzenie permutacji indeksu, ale w moim przypadku nie jest to wygodne.
Dodano:
Czasami, gdy ludzie mówią o permutacjach, mają na myśli jedynie próbkowanie permutacji losowych, na przykład jako część procedury uzyskiwania wartości pw statystyce. Lub oznaczają zliczanie lub wyliczanie wszystkich możliwych permutacji. Nie mówię o tych rzeczach.
Dodano:
Matryca jest wystarczająco mała, aby zmieściła się w RAM-ie pulpitu, ale wystarczająco duża, że nie chcę jej bezmyślnie kopiować. Właściwie chciałbym używać macierzy tak dużych, jak to możliwe, ale nie chcę uporać się z niedogodnościami związanymi z niemożnością trzymania ich w pamięci RAM i wykonuję operacje O (N ^ 3) LAPACK na macierzy, które również ograniczyć praktyczny rozmiar matrycy. Obecnie niepotrzebnie kopiuję macierze tak duże, ale mam nadzieję, że można tego łatwo uniknąć w przypadku permutacji.
źródło
M[v]
permutować wiersze.Odpowiedzi:
Według dokumentów nie ma metody permutacji w miejscu w numpy, coś takiego jak ndarray.sort .
Więc masz opcje (zakładając, żeN×N
M
jest to macierz i wektor permutacji)p
Mam nadzieję, że te nieoptymalne hacki są przydatne.
źródło
Ostrzeżenie: poniższy przykład działa poprawnie, ale użycie pełnego zestawu parametrów sugerowanych po zakończeniu ujawnia błąd lub przynajmniej „nieudokumentowaną funkcję” w funkcji numpy.take (). Szczegóły znajdują się w komentarzach poniżej. Zgłoszony raport o błędzie .
Możesz to zrobić w miejscu za pomocą funkcji take () numpy , ale wymaga to nieco przeskoku.
Oto przykład losowej permutacji wierszy macierzy tożsamości:
Aby to zrobić w miejscu, wystarczy podać parametr „out”, aby był taki sam jak tablica wejściowa ORAZ musisz ustawić tryb = „klip” lub tryb = „zawiń”. Jeśli nie ustawisz trybu, utworzy kopię, aby przywrócić stan tablicy w wyjątku Pythona (patrz tutaj) .
Na koniec uwaga wydaje się być metodą tablicową, więc zamiast
możesz zadzwonić
jeśli to bardziej do gustu. W sumie zadzwoń powinien wyglądać mniej więcej tak:
Aby permutować zarówno wiersze, jak i kolumny, myślę, że albo trzeba je uruchomić dwa razy, albo wyciągnąć brzydkie shenanigany za pomocą numpy.unravel_index, który boli mnie do myślenia.
źródło
1.6.2
,test take, not overwriting: True
,test not-in-place take: True
,test in-place take: False
,rr [3, 7, 8, 1, 4, 5, 9, 0, 2, 6]
,arr [30 70 80 70 40 50 90 30 80 90]
,ref [30 70 80 10 40 50 90 0 20 60]
. Tak więcnp.take
przynajmniej dla Numpy 1.6.2 nie jest świadomy rutynowej permutacji i wszystko psuje.Jeśli masz rzadką macierz przechowywaną w
COO
formacie, pomocne mogą być następujące elementyprzy założeniu, żem m
A
zawieraCOO
matrycę, orazperm
jestnumpy.array
zawierający permutacji. Będzie to miało tylko narzut pamięci , gdzie jest liczbą niezerowych elementów macierzy.mźródło
C00
macierzy rzadkich na pierwszym miejscu?int
si 1float
w rzadkiej reprezentacji na element jako pojedynczafloat
w gęstej reprezentacji). Ale narzut pamięci tej metody będzie w gęstym przypadku, więc prawdopodobnie lepiej byłoby trzymać się zwykłych s.numpy.ndarray
Nie mam wystarczającej reputacji, aby móc komentować, ale myślę, że następujące SO pytanie może być pomocne: /programming/4370745/view-onto-a-numpy-array
Podstawowe punkty, które można wykorzystać podstawową krojenie i że stworzy widok na do tablicy bez kopiowania, ale jeśli zaawansowanym krojenia / indeksowanie to będzie utworzyć kopię.
źródło
Co powiesz na
moja_tablica [:, [0, 1]] = moja_tablica [:, [1, 0]]
źródło