find(A>9,1)
对于 numpy/scipy.matlab是否有等效的功能?我知道nonzero
numpy 中有这个函数,但我需要的是第一个索引,以便我可以在另一个提取的列中使用第一个索引。
例如:将在 matlab 中A = [ 1 2 3 9 6 4 3 10 ]
find(A>9,1)
返回索引4
numpy 中的等价物find
是nonzero
,但它不支持第二个参数。但是你可以做这样的事情来获得你正在寻找的行为。
B = nonzero(A >= 9)[0]
但是,如果您正在寻找的只是找到满足条件的第一个元素,那么您最好使用max
.
例如,在 matlab 中,find(A >= 9, 1)
将与[~, idx] = max(A >= 9)
. numpy 中的等效函数如下。
idx = (A >= 9).argmax()
matlab的find(X, K)
大致相当于numpy.nonzero(X)[0][:K]
python中的。@Pavan 的 argmax 方法可能是一个不错的选择 if 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
John 发布了以下代码,它解释了 find 的第一个参数,在您的情况下是 A>9 ---find(A>9,1)-- 但不是第二个参数。
我修改了 John 的代码,我认为这是第二个参数“,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]
import numpy
A = numpy.array([1, 2, 3, 9, 6, 4, 3, 10])
index = numpy.where(A >= 9)
您可以通过首先将列表转换为 ndarray,然后使用函数 numpy.where() 来获取所需的索引来做到这一点。
考虑argwhere
在 Python 中使用来替换 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。