2012-10-23 11 views
15

Musi istnieć (bardzo) szybki i skuteczny sposób na uzyskanie tylko elementów z tablicy numpy, lub jeszcze bardziej interesująco z jej fragmentu. Załóżmy, że mam numpy tablicy:Uzyskiwanie tylko tych wartości, które spełniają warunek w tablicy numpy

import numpy as np 
a = np.arange(-10,10) 

Teraz, jeśli mam listę:

s = [9, 12, 13, 14] 

mogę wybrać elementy z A:

a[s] #array([-1, 2, 3, 4]) 

Jak mogę mieć (numpy) macierz złożona z elementów z [s], które spełniają warunek, tj. są dodatnie (lub ujemne)? powinno skutkować

np.ifcondition(a[s]>0, a[s]) #array([2, 3, 4]) 

Wygląda to trywialne, ale nie byłem w stanie znaleźć prosty i skondensowany wyraz. Jestem pewien, że maski robią, ale nie wygląda to tak naprawdę bezpośrednio dla mnie. Jednak ani:

a[a[s]>0] 
a[s[a[s]>0]] 

są w rzeczywistości dobrym wyborem.

Dzięki za pomoc.

+0

Większość narzędzi, takich jak 'np.clip' lub' np.where', pozostawia oryginalny rozmiar tablicy, więc nie pasują one do moich potrzeb. – gluuke

Odpowiedz

12

Jak o:

In [19]: b = a[s] 

In [20]: b[b > 0] 
Out[20]: array([2, 3, 4]) 
+0

w prawo! ... wydaje się działać: po prostu muszę zdefiniować nową tablicę. – gluuke

+2

'a [s] [a [s]> 0]' działa również, ale powoduje numpy do ponownego obliczenia 'a [s]' dwa razy. – unutbu

+0

To jest standardowy sposób robienia tego rodzaju rzeczy. (+1 ode mnie) – mgilson

4

powinno się akceptować odpowiedź unutbu, a to jest to, co zazwyczaj używają do tego rodzaju sytuacji w numpy. Ale w interesie posiadające wiele sposobów robienia rzeczy, o metodę, która działa poza numpy, lub w przypadku pośredniego tablica jest ofensywnie ogromny, dodam tę alternatywę:

In [3]: [a[S] for S in s if a[S]>0] 
Out[3]: [2, 3, 4] 

Ponownie metoda unutbu jest znacznie szybciej. Ale podoba mi się ta metoda, ponieważ może generalizować jeszcze bardziej. Jeśli masz drogiego funkcję ostry (np nie indeksowania), a chcesz przetestować wynik tej funkcji, można to zrobić:

In [5]: [f for S in s for f in [FunkyFunction(a[S])] if f>0] 
Out[5]: [2, 3, 4] 

Upiorna część jest to, że zrobić listę wewnątrz druga lista, ale ta wewnętrzna lista zawiera tylko jeden element. Zasadniczo to, co robisz, to zapisanie wartości do zmiennej f, a następnie dwukrotne użycie tej wartości: raz, aby przetestować wartość (f>0), i raz, aby użyć tej wartości na liście, jeśli test przejdzie.

1

Jestem świadomy, że jest to stare pytanie i nie jestem pewien, czy poniższe informacje były dostępne w czasie, gdy je zadawano, ale skoro dostałem się tutaj z podobnym pytaniem, to właśnie stwierdziłem, że zadziałało. dla mnie:

np.extract(a[s] > 0, a[s]) 
Powiązane problemy