2013-01-17 30 views
7

對於numpy/scipy,matlab中是否有相當於find(A>9,1)的函數?我知道在numpy中有nonzero函數,但我需要的是第一個索引,以便我可以在另一個提取列中使用第一個索引。在numpy/scipy中查找函數matlab

例:A = [ 1 2 3 9 6 4 3 10 ] find(A>9,1)將在MATLAB

+0

你的意思'> ='?因爲'>'會返回8. –

+1

實際上,numpy數組是基於零的,所以'9'位於位置'3','10'位於'7'位置。 – Jaime

回答

5

find在numpy的等效是nonzero回報指數4,但它不支持第二個參數。 但是你可以做這樣的事情來獲得你正在尋找的行爲。

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

但是,如果你正在尋找的是找到滿足條件的第一個元素,你最好使用max

例如,在matlab中,find(A >= 9, 1)將與[idx, B] = max(A >= 9)相同。 numpy中的等價函數如下所示。

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

MATLAB的find(X, K)大約相當於numpy.nonzero(X)[0][:K]的蟒蛇。 @帕的argmax方法可能是,如果K == 1一個很好的選擇,但除非你知道先驗會有在A> = 9的值,你可能需要做一些事情,如:

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

我敢肯定,這些都是很好的答案,但我無法使用它們。然而,我發現另一個線程,部分回答這個問題: MATLAB-style find() function in Python

約翰發佈了以下代碼查找find的第一個參數,在您的情況A> 9 --- find(A> 9,1) - 但不是第二個參數。

我改變了約翰的代碼,我相信佔第二個參數」,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] 

這將返回閾值= 3。我的理解是,Python的索引從0開始......所以它相當於說matlab 4.你可以通過改變括號中的數字[1],[2]等來改變被調用索引的值,而不是[0]。

約翰的原代碼:

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) 

返回>>> INDS [2,5,8]

0

考慮使用Python argwhere取代MATLAB的find功能。例如,

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

返回3