首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python中的MATLAB风格的find()函数

Python中的MATLAB风格的find()函数
EN

Stack Overflow用户
提问于 2011-05-11 07:02:43
回答 8查看 69K关注 0票数 62

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

代码语言:javascript
复制
>> 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做这件事最好的方法是什么?

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

代码语言:javascript
复制
>>> a = [1,2,3,1,2,3,1,2,3]
>>> [val for val in a if val > 2]
[3, 3, 3]

但是如果我想要这些值的索引,就有点复杂了:

代码语言:javascript
复制
>>> 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‘的函数,但我目前无法访问这些库。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2011-05-11 08:03:19

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

代码语言:javascript
复制
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。

票数 29
EN

Stack Overflow用户

发布于 2011-05-11 07:49:35

在numpy中有where

代码语言:javascript
复制
>> import numpy as np
>> x = np.random.randint(0, 20, 10)
>> x
array([14, 13,  1, 15,  8,  0, 17, 11, 19, 13])
>> np.where(x > 10)
(array([0, 1, 3, 6, 7, 8, 9], dtype=int64),)
票数 93
EN

Stack Overflow用户

发布于 2014-06-04 16:44:48

或者使用numpy的非零函数:

代码语言:javascript
复制
import numpy as np
a    = np.array([1,2,3,4,5])
inds = np.nonzero(a>2)
a[inds] 
array([3, 4, 5])
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5957470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档