Załóżmy, że mam numpy tablicy x = [5, 2, 3, 1, 4, 5]
, y = ['f', 'o', 'o', 'b', 'a', 'r']
. Chcę wybrać elementy y
odpowiadające elementom w x
których są większe niż 1 i mniejsze niż 5.
próbowałem
x = array([5, 2, 3, 1, 4, 5])
y = array(['f','o','o','b','a','r'])
output = y[x > 1 & x < 5] # desired output is ['o','o','a']
ale to nie działa. Jak bym to zrobił?
&
ma wyższy priorytet niż<
i>
, które z kolei mają wyższy priorytet niż (logiczny)and
.x > 1 and x < 5
najpierw ewaluuje nierówności, a potem logiczną koniunkcję;x > 1 & x < 5
oblicza bitową koniunkcję1
i (wartości w)x
, a następnie nierówności.(x > 1) & (x < 5)
zmusza nierówności do oceny w pierwszej kolejności, więc wszystkie operacje odbywają się w zamierzonej kolejności, a wyniki są dobrze zdefiniowane. Zobacz dokumentację tutaj.(0 < x) & (x < 10)
(jak pokazano w odpowiedzi), zamiast tego0 < x < 10
nie działa dla tablic numpy w żadnej wersji Pythona.IMO OP tak naprawdę nie chce
np.bitwise_and()
(aka&
), ale faktycznie chce,np.logical_and()
ponieważ porównuje wartości logiczne, takie jakTrue
iFalse
- zobacz ten post SO dotyczący logiki i bitów, aby zobaczyć różnicę.Równoważnym sposobem jest
np.all()
odpowiednie ustawienieaxis
argumentu.według liczb:
więc używanie
np.all()
jest wolniejsze, ale&
ilogical_and
są mniej więcej takie same.źródło
output = y[np.logical_and(x > 1, x < 5)]
,x < 5
jest oceniane (prawdopodobnie tworząc ogromną tablicę), mimo że jest to drugi argument, ponieważ ta ocena ma miejsce poza funkcją. IOW,logical_and
otrzymuje dwa już ocenione argumenty. Różni się to od zwykłego przypadkua and b
, w którymb
nie jest oceniane, czya
jest prawdziwe.Dodaj jeden szczegół do odpowiedzi @JF Sebastiana i @Marka Mikofskiego:
Jeśli chcesz uzyskać odpowiednie indeksy (zamiast rzeczywistych wartości tablicy), zrobi to następujący kod:
Aby spełnić wiele (wszystkich) warunków:
Aby spełnić wiele (lub) warunków:
źródło
(the array of indices you want,)
, więc musiszselect_indices = np.where(...)[0]
uzyskać żądany wynik i oczekuj.Lubię używać
np.vectorize
do takich zadań. Rozważ następujące:Zaletą jest to, że w funkcji wektoryzowanej można dodać znacznie więcej typów ograniczeń.
Mam nadzieję, że to pomoże.
źródło
Właściwie zrobiłbym to w ten sposób:
L1 to lista indeksowa elementów spełniających warunek 1; (może możesz użyć
somelist.index(condition1)
lub,np.where(condition1)
aby uzyskać L1).Podobnie, otrzymujesz L2, listę elementów spełniających warunek 2;
Następnie znajdziesz przecięcie za pomocą
intersect(L1,L2)
.Możesz również znaleźć przecięcie wielu list, jeśli masz wiele warunków do spełnienia.
Następnie możesz zastosować indeks w dowolnej innej tablicy, na przykład x.
źródło
W przypadku tablic 2D możesz to zrobić. Utwórz maskę 2D, używając warunku. Prześlij maskę warunku na typ int lub float, w zależności od tablicy, i pomnóż ją przez oryginalną tablicę.
źródło