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.
x[np.array([1, 1, 3, 1])] += 1zmodyfikowanox. Teraz to rozumiem!