Python中的MATLAB样式的find()函数

发布于 2021-01-29 18:41:52

在MATLAB中,很容易找到满足特定条件的值的索引:

>> a = [1,2,3,1,2,3,1,2,3];
>> find(a > 2)     % find the indecies where this condition is true
[3, 6, 9]          % (MATLAB uses 1-based indexing)
>> a(find(a > 2))  % get the values at those locations
[3, 3, 3]

用Python做到这一点的最佳方法是什么?

到目前为止,我已经提出了以下建议。仅获取值:

>>> a = [1,2,3,1,2,3,1,2,3]
>>> [val for val in a if val > 2]
[3, 3, 3]

但是,如果我想要每个值的索引,则要复杂一些:

>>> a = [1,2,3,1,2,3,1,2,3]
>>> inds = [i for (i, val) in enumerate(a) if val > 2]
>>> inds
[2, 5, 8]
>>> [val for (i, val) in enumerate(a) if i in inds]
[3, 3, 3]

在Python中是否有更好的方法可以做到这一点,尤其是对于任意条件(不仅仅是’val> 2’)?

我在NumPy中找到了与MATLAB’find’等效的函数,但目前无法访问这些库。

关注者
0
被浏览
173
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您可以使函数采用可调用参数,该参数将在列表理解的条件部分中使用。然后,您可以使用lambda或其他函数对象传递您的任意条件:

    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]
    

    它与您的Matlab示例更加接近,而无需加载所有numpy。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看