對於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
對於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
的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()
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
...
我敢肯定,這些都是很好的答案,但我無法使用它們。然而,我發現另一個線程,部分回答這個問題: 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]
考慮使用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
你的意思'> ='?因爲'>'會返回8. –
實際上,numpy數組是基於零的,所以'9'位於位置'3','10'位於'7'位置。 – Jaime