在numpy/scipy中查找Matlab的函数

9
有没有numpy/scipy中与matlab中的find(A>9,1)等价的函数?我知道在numpy中有nonzero函数,但我需要的是第一个索引,这样我才能使用所提取的另一列中的第一个索引。例如:A = [ 1 2 3 9 6 4 3 10 ],在matlab中find(A>9,1)将返回索引4

1
你的意思是 >= 吗?因为 > 会返回8。 - Pavan Yalamanchili
1
实际上,numpy数组是从零开始的,所以9在位置310在位置7 - Jaime
5个回答

7
在numpy中,与find等同的是nonzero,但它不支持第二个参数。但是,可以像这样做来获取您想要的行为。
B = nonzero(A >= 9)[0] 

但如果你只是想找到满足条件的第一个元素,最好使用max

例如,在matlab中,find(A >= 9, 1)[~, idx] = max(A >= 9)相同。在numpy中相应的函数是以下内容。

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

2

Matlab的find(X, K)在Python中大致等同于numpy.nonzero(X)[0][:K]。如果K == 1,则Pavan的argmax方法可能是一个不错的选择,但除非您事先知道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">MATLAB风格的Python中的find()函数

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]

这个返回 threshold=3。我的理解是Python的索引从0开始...所以这相当于matlab中的4。你可以通过改变方括号中的数字(即[1], [2]等)来改变调用的索引值,而不是[0]。
John的原始代码:
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)

该段文字涉及编程相关内容,保留了HTML格式,并展示了一个返回值为 [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。


0
import numpy
A = numpy.array([1, 2, 3, 9, 6, 4, 3, 10])
index = numpy.where(A >= 9)

您可以先将列表转换为ndarray,然后使用函数numpy.where()获取所需的索引。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接