Wyświetlić tablicę numpy?

90

Mam numpytablicę 2D . Czy istnieje sposób na utworzenie widoku, który obejmowałby pierwsze kwiersze i wszystkie kolumny?

Chodzi o to, aby uniknąć kopiowania danych bazowych (tablica jest tak duża, że ​​wykonanie częściowych kopii nie jest możliwe).

NPE
źródło

Odpowiedzi:

230

Jasne, po prostu zindeksuj go tak, jak zwykle. Np. y = x[:k, :] To zwróci widok do oryginalnej tablicy. Żadne dane nie zostaną skopiowane, a wszelkie aktualizacje wprowadzone do yzostaną odzwierciedlone xi odwrotnie.


Edytować:

Zwykle pracuję z macierzami 3D uint8 o pojemności> 10 GB, więc bardzo się tym martwię ... Numpy może być bardzo skuteczny w zarządzaniu pamięcią, jeśli weźmiesz pod uwagę kilka rzeczy. Oto kilka wskazówek, jak unikać tworzenia kopii tablic w pamięci:

Zastosowanie +=, -=, *=itd, aby uniknąć tworzenia kopii tablicy. Np. x += 10Zmodyfikuje tablicę w miejscu, podczas gdy x = x + 10zrobi kopię i zmodyfikuje ją. (również spójrz na numexpr )

Jeśli chcesz wykonać kopię za pomocą x = x + 10, pamiętaj, że x = x + 10.0spowoduje xto automatyczne przeniesienie w górę do tablicy zmiennoprzecinkowej, jeśli jeszcze nie było. Jednak, x += 10.0gdzie xjest tablicą liczb całkowitych, spowoduje 10.0zamiast tego rzutowanie w dół do int o tej samej precyzji co tablica.

Ponadto wiele funkcji numpy przyjmuje outparametr, więc możesz na przykład np.abs(x, x)pobierać wartość bezwzględną xw miejscu.


Jako druga zmiana, oto kilka dodatkowych wskazówek dotyczących widoków i kopii z tablicami numpy:

W przeciwieństwie do list Pythona, y = x[:]nie zwraca kopii, zwraca widok. Jeśli chcesz mieć kopię (co oczywiście podwoi ilość używanej pamięci), użyjy = x.copy()

Często słyszysz o „fantazyjnym indeksowaniu” numpy tablic. Używanie listy (lub tablicy liczb całkowitych) jako indeksu jest „fantazyjnym indeksowaniem”. Może być bardzo przydatne, ale kopiuje dane.

Jako przykład: y = x[[0, 1, 2], :]zwraca kopię, podczas gdy y = x[:3,:]zwróci widok.

x[4:100:5, :-10:-1, None]Jednak nawet naprawdę szalone indeksowanie, takie jak „normalne” indeksowanie, zwróci widok, więc nie bój się używać wszelkiego rodzaju sztuczek do wycinania dużych tablic.

x.astype(<dtype>)zwróci kopię danych jako nowy typ, a x.view(<dtype>)zwróci widok.

Uważaj jednak ... Jest to niezwykle potężne i przydatne, ale musisz zrozumieć, w jaki sposób podstawowe dane są przechowywane w pamięci. Jeśli masz tablicę liczb zmiennoprzecinkowych i wyświetlasz je jako liczby całkowite (lub odwrotnie), numpy zinterpretuje podstawowe bity tablicy jako liczby całkowite.

Na przykład oznacza to, że 1.0jako 64-bitowy float w systemie little-endian będzie 4607182418800017408postrzegany jako 64- [ 0, 0, 0, 0, 0, 0, 240, 63]bitowy int, a tablica, jeśli będzie postrzegana jako uint8. Jest to naprawdę fajne, gdy trzeba coś zmienić w bitach na dużych tablicach, chociaż ... Masz niską kontrolę nad sposobem interpretacji bufora pamięci.

Joe Kington
źródło
Dzięki za bardzo miłe wskazówki! Czytałem podręcznik użytkownika Numpy i pomyliłem się, dlaczego x[np.array([1, 1, 3, 1])] += 1zmodyfikowano x. Teraz to rozumiem!
tnq177
fajne wskazówki! Mam jeszcze pytanie. Jak udowodnić, że numpy nie uruchamia kopii, ale tylko widok? Python's id () wydaje się niezdolny do tego.
wuhaochi
3
@wuhaochi Jeśli bjest to widok a, to b.base is abędzie True. Kopia (dowolnej tablicy) zawsze będzie miałaarr_copy.base is None
Jürg Merlin Spaak