当前位置: 首页 > 面试题库 >

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

裘光启
2023-03-14
问题内容

在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’等效的函数,但目前无法访问这些库。


问题答案:

您可以使函数采用可调用参数,该参数将在列表理解的条件部分中使用。然后,您可以使用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。



 类似资料:
  • 我是Python新手,和许多人一样来自Matlab。我习惯于将我的函数定义为独立函数。只要函数保存在定义的Matlab路径中的某个位置,就可以从第二个脚本轻松调用它们。 我已经学会了如何在Python中定义(用户定义的)函数(def my_function()等),但我在Google搜索中发现了一种在单独的应用程序中定义函数的方法。py文件A,以及如何在另一个脚本B中调用它。我能找到的所有帮助文件

  • 问题内容: 经过多次尝试优化代码之后,似乎最后的资源就是尝试使用多个内核来运行以下代码。我不确切地知道如何转换/重组我的代码,以便它可以使用多个内核更快地运行。如果能得到指导以实现最终目标,我将不胜感激。最终目标是能够对数组A和B尽可能快地运行此代码,其中每个数组包含大约700,000个元素。这是使用小数组的代码。700k元素数组已被注释掉。 我想做的是模仿一个称为ismember [2]的MAT

  • 问题内容: 我想编写一个Python函数,该函数可以改变其中一个参数(它是一个列表,即可变的)。像这样: 与Python的设置(无论您决定调用它)相比,我对按值传递更为熟悉。所以我通常会这样写一个函数: 这是我的困惑。由于我只能更改参数,因此第二种方法似乎是多余的。但是第一个 感觉不对。 另外,我的特定函数将具有多个参数,只有其中一个会更改。第二种方法可以清楚地知道正在更改的参数(因为已将其分配给

  • 问题内容: 我知道我想做的事情很简单,但这让我感到悲伤。我想使用BeautifulSoup从HTML中提取数据。为此,我需要正确使用该功能。这是我正在使用的HTML: 我想要的值是from ,from和from 。 使用过去的代码和在线示例,这是我到目前为止的内容: 到目前为止都没有任何效果。我不确定如何制作此查找表以提取号码。 问题答案: 在这里,您正在寻找一个元素,但是在示例HTML数据中具有

  • find函数确定已给逻辑条件的数组元素的指标。 以它最简单的形式,返回一个指标的列向量。求这个向量的转置以获得一个指标的单行矩阵。例如: k = find(isprime(A))' 用一维标定指数挑选出素数在魔方中的位置。 k = 2 5 9 10 11 13 以按照k决定的次序的行向量展示这些素数,有 A(k) ans =

  • 问题内容: 我目前正在浏览Go,并且认为goroutines的用法类似于Python生成器,尤其是Question 66 。我以为66看起来很复杂,因此我将其改写为: 这似乎有效。几个问题: 如果我将通道上的缓冲区大小设置为10,则将尽快填充另外10个点,并且会尽快耗尽这些点。这是正确的吗?这会比内存大小为1的缓冲区更好,但是会占用内存,对吗? 由于通道不会被发送方关闭,因此当我们超出范围时在内存