Jak mogę usunąć niektóre określone elementy z tablicy numpy? Powiedz, że mam
import numpy as np
a = np.array([1,2,3,4,5,6,7,8,9])
Następnie chcę usunąć 3,4,7
z a
. Wiem tylko indeks wartości ( index=[2,3,6]
).
Użyj numpy.delete () - zwraca nową tablicę z usuniętymi pod-tablicami wzdłuż usuniętej osi
numpy.delete(a, index)
W przypadku konkretnego pytania:
import numpy as np
a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
index = [2, 3, 6]
new_a = np.delete(a, index)
print(new_a) #Prints `[1, 2, 5, 6, 8, 9]`
Zauważ, że numpy.delete()
zwraca nową tablicę, ponieważ skalary tablic są niezmienne, podobnie jak łańcuchy w Pythonie, więc za każdym razem, gdy wprowadzana jest do niej zmiana, tworzony jest nowy obiekt. Cytując delete()
dokumenty :
„ Kopia arr z usuniętymi elementami określonymi przez obj. Pamiętaj, że usuwanie nie występuje w miejscu ...”
Jeśli kod, który publikuję, ma wynik, jest to wynikiem uruchomienia kodu.
Pomaga w tym wbudowana funkcja numpy.
źródło
np.setdiff1d(np.array(['one','two']),np.array(['two', 'three']))
Tablica Numpy jest niezmienna , co oznacza, że technicznie nie można usunąć z niej elementu. Możesz jednak zbudować nową tablicę bez wartości, których nie chcesz:
źródło
a[0]=1
modyfikujea
w miejscu. Ale nie można zmienić ich rozmiaru.Aby usunąć według wartości:
źródło
Nie będąc odrętwioną osobą, zrobiłem zdjęcie z:
Według moich testów osiąga to lepsze wyniki
numpy.delete()
. Nie wiem, dlaczego tak się dzieje, może z powodu małego rozmiaru początkowej tablicy?To dość znacząca różnica (w przeciwnym kierunku, niż się spodziewałem), ktoś ma pojęcie, dlaczego tak się dzieje?
Co dziwniejsze, przekazywanie
numpy.delete()
listy działa gorzej niż zapętlanie listy i nadawanie jej pojedynczych wskaźników.Edycja: Wydaje się, że ma to związek z rozmiarem tablicy. Przy dużych tablicach
numpy.delete()
jest znacznie szybszy.Oczywiście to wszystko jest dość nieistotne, ponieważ zawsze powinieneś dążyć do jasności i unikać odkrywania koła na nowo, ale uważam to za trochę interesujące, więc pomyślałem, że zostawię to tutaj.
źródło
a = delte_stuff(a)
w swojej pierwszej iteracji, któraa
zmniejsza się z każdą iteracją. Kiedy używasz funkcji wbudowanej, nie zapisujesz wartości z powrotem do a, która zachowuje oryginalny rozmiar! Poza tym możesz drastycznie przyspieszyć swoją funkcję, gdy utworzysz zestawindex
i sprawdź, czy chcesz usunąć element. Naprawiając obie rzeczy, dostaję za 10 000 pozycji: 6,22 ms na pętlę z twoją funkcją, 4,48 ms dlanumpy.delete
, co jest mniej więcej tym, czego możesz się spodziewać.np.array(list(range(x)))
używaćnp.arange(x)
i do tworzenia indeksu możesz użyćnp.s_[::2]
.Jeśli nie znasz indeksu, nie możesz go użyć
logical_and
źródło
Używanie
np.delete
jest najszybszym sposobem na zrobienie tego, jeśli znamy wskaźniki elementów, które chcemy usunąć. Jednak dla kompletności dodam inny sposób „usuwania” elementów tablicy za pomocą maski logicznej utworzonej za pomocąnp.isin
. Ta metoda pozwala nam usunąć elementy, określając je bezpośrednio lub według ich indeksów:Usuń według indeksów :
Usuń według elementów (nie zapomnij odtworzyć oryginału,
a
ponieważ został przepisany w poprzednim wierszu):źródło
Usuń określony indeks (usunąłem 16 i 21 z matrycy)
Wynik:
źródło
Możesz także użyć zestawów:
źródło