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 y
zostaną odzwierciedlone x
i 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 += 10
Zmodyfikuje tablicę w miejscu, podczas gdy x = x + 10
zrobi 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.0
spowoduje x
to automatyczne przeniesienie w górę do tablicy zmiennoprzecinkowej, jeśli jeszcze nie było. Jednak, x += 10.0
gdzie x
jest tablicą liczb całkowitych, spowoduje 10.0
zamiast tego rzutowanie w dół do int o tej samej precyzji co tablica.
Ponadto wiele funkcji numpy przyjmuje out
parametr, więc możesz na przykład np.abs(x, x)
pobierać wartość bezwzględną x
w 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.0
jako 64-bitowy float w systemie little-endian będzie 4607182418800017408
postrzegany 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.
x[np.array([1, 1, 3, 1])] += 1
zmodyfikowanox
. Teraz to rozumiem!b
jest to widoka
, tob.base is a
będzieTrue
. Kopia (dowolnej tablicy) zawsze będzie miałaarr_copy.base is None