9

find(A>9,1)对于 numpy/scipy.matlab是否有等效的功能?我知道nonzeronumpy 中有这个函数,但我需要的是第一个索引,以便我可以在另一个提取的列中使用第一个索引。

例如:将在 matlab 中A = [ 1 2 3 9 6 4 3 10 ] find(A>9,1)返回索引4

4

5 回答 5

7

numpy 中的等价物findnonzero,但它不支持第二个参数。但是你可以做这样的事情来获得你正在寻找的行为。

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

但是,如果您正在寻找的只是找到满足条件的第一个元素,那么您最好使用max.

例如,在 matlab 中,find(A >= 9, 1)将与[~, idx] = max(A >= 9). numpy 中的等效函数如下。

idx = (A >= 9).argmax()
于 2013-01-17T22:08:58.033 回答
2

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
    ...
于 2013-01-17T22:13:19.163 回答
1

我确信这些都是很好的答案,但我无法使用它们。但是,我发现另一个线程部分回答了这个问题: 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]

于 2015-03-12T15:55:38.300 回答
0
import numpy
A = numpy.array([1, 2, 3, 9, 6, 4, 3, 10])
index = numpy.where(A >= 9)

您可以通过首先将列表转换为 ndarray,然后使用函数 numpy.where() 来获取所需的索引来做到这一点。

于 2019-03-07T14:05:15.510 回答
0

考虑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。

于 2016-08-04T21:56:55.213 回答