2013-01-17 15 views
7

Czy istnieje odpowiednik funkcji find(A>9,1) z Matlab dla numpy/scipy. Wiem, że istnieje funkcja nonzero w numpy, ale potrzebuję pierwszego indeksu, aby móc użyć pierwszego indeksu w innej wyodrębnionej kolumnie.znaleźć funkcję matlab w numpy/scipy

Np A = [ 1 2 3 9 6 4 3 10 ] find(A>9,1) powróci indeks 4 w Matlab

+0

Czy to znaczy '> ='? ponieważ '>' zwróci 8. –

+1

W rzeczywistości, numpy tablice są oparte na zero, więc '9' jest w pozycji' 3' i '10' w pozycji' 7'. – Jaime

Odpowiedz

5

Odpowiednik find w numpy jest nonzero, ale nie obsługuje drugiego parametru. Ale możesz zrobić coś takiego, aby uzyskać zachowanie, którego szukasz.

B = nonzero(A >= 9)[0] 

Ale jeśli wszystkie szukasz jest znalezienie pierwszego elementu spełniającego warunek, jesteś lepiej wyłączyć za pomocą max.

Na przykład w programie Matlab find(A >= 9, 1) będzie taki sam, jak [idx, B] = max(A >= 9). Odpowiednia funkcja w numpy byłaby następująca.

idx = (A >= 9).argmax() 
1

Matlab na find(X, K) jest z grubsza odpowiednikiem numpy.nonzero(X)[0][:K] w Pythonie. @ Argmax metoda PAVAN jest dobrym rozwiązaniem, jeśli K == 1, ale chyba wiesz Apriori, że nie będzie to wartość w A> = 9, prawdopodobnie będziesz musiał zrobić coś takiego:

idx = (A >= 9).argmax() 
if (idx == 0) and (A[0] < 9): 
    # No value in A is >= 9 
    ... 
1

Jestem pewien, że te są świetnymi odpowiedziami, ale nie byłem w stanie ich wykorzystać. Jednak znalazłem inny wątek, który częściowo odpowiada na to: MATLAB-style find() function in Python

John opublikował następujący kod, który wyjaśnia pierwszy argument znalezienia, w twoim przypadku A> 9 --- find (A> 9,1) - ale nie drugi argument.

I zmieniany Jana kod, który Wierzę kont dla drugiego argumentu”, 1"

def indices(a, func): 
    return [i for (i, val) in enumerate(a) if func(val)] 
a = [1,2,3,9,6,4,3,10] 
threshold = indices(a, lambda y: y >= 9)[0] 

ta zwraca próg = 3. Rozumiem, że indeks Pythona zaczyna się od 0 ... więc jest to odpowiednik matlab mówiącego: 4. Możesz zmienić wartość wywoływanego indeksu, zmieniając liczbę w nawiasach, tj. [1], [2] itd. Zamiast [0].

oryginalny kod Jana:

def indices(a, func): 
    return [i for (i, val) in enumerate(a) if func(val)] 

a = [1, 2, 3, 1, 2, 3, 1, 2, 3] 

inds = indices(a, lambda x: x > 2) 

która zwraca >>> inds [2, 5, 8]

0

rozważyć użycie argwhere w Pythonie zastąpić find funkcji Matlaba. Na przykład,

import numpy as np 
A = [1, 2, 3, 9, 6, 4, 3, 10] 
np.argwhere(np.asarray(A)>=9)[0][0] # Return first index 

powraca 3.

Powiązane problemy