2013-01-17 9 views
7

Gibt es eine äquivalente Funktion von find(A>9,1) von Matlab für numpy/scipy. Ich weiß, dass es die nonzero Funktion in numpy gibt, aber was ich brauche, ist der erste Index, so dass ich den ersten Index in einer anderen extrahierten Spalte verwenden kann.Funktion finden Matlab in numpy/scipy

Ex: A = [ 1 2 3 9 6 4 3 10 ] find(A>9,1) würde Return Index 4 in Matlab

+0

Meinen Sie '> ='? weil '>' würde 8. zurückgeben. –

+1

Eigentlich sind numpy Arrays Null basiert, so dass die '9' in Position' 3' und die '10' in Position' 7' ist. – Jaime

Antwort

5

Das Äquivalent find in numpy nonzero ist, aber nicht einen zweiten Parameter unterstützen. Aber Sie können so etwas tun, um das Verhalten zu erhalten, das Sie suchen.

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

Aber wenn alles, das Sie suchen, ist das erste Element zu finden, die eine Bedingung erfüllt, sind Sie besser dran max verwenden.

Zum Beispiel wäre in Matlab find(A >= 9, 1) das gleiche wie [idx, B] = max(A >= 9). Die äquivalente Funktion in numpy wäre die folgende.

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

Matlab find(X, K) entspricht in etwa numpy.nonzero(X)[0][:K] in Python. @ Pavan argmax Methode ist wahrscheinlich eine gute Option, wenn K == 1, aber wenn man a priori wissen, dass es müssen einen Wert in A> = 9, werden Sie wahrscheinlich tun, wie etwas sein wird:

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

Ich bin sicher, dass diese sind alle gute Antworten, aber ich konnte sie nicht nutzen. Allerdings fand ich einen anderen Thread, der diese teilweise beantwortet: MATLAB-style find() function in Python

John den folgenden Code geschrieben, die von finden für das erste Argument ausmacht, in Ihrem Fall A> 9 --- finden (A> 9,1) - aber nicht das zweite Argument.

Ich änderte Code Johns, die ich Konten für das zweite Argument“, 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] 

Dies gibt Schwelle = 3 glauben. Mein Verständnis ist, dass Pythons Index bei 0 beginnt ... also ist es das Äquivalent von Matlab, das 4 sagt. Sie können den Wert des Index ändern, der angerufen wird, indem Sie die Zahl in den Klammern dh [1], [2] usw. ändern [0].

Johns Original-Code:

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) 

die >>> inds gibt [2, 5, 8]

0

Betrachten argwhere in Python mit MATLAB find Funktion zu ersetzen. Zum Beispiel

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

kehrt 3.