【问题标题】:Getting only those values that fulfill a condition in a numpy array仅获取满足 numpy 数组中条件的值
【发布时间】:2012-10-23 11:03:26
【问题描述】:

必须有一种(非常)快速有效的方法来仅从 numpy 数组中获取元素,或者更有趣的是从它的切片中获取元素。 假设我有一个 numpy 数组:

import numpy as np
a = np.arange(-10,10)

如果我有一个列表:

s = [9, 12, 13, 14]

我可以从 a 中选择元素:

a[s]  #array([-1,  2,  3,  4])

我怎样才能拥有一个由 a[s] 中满足条件的元素组成的(numpy)数组,即为正(或负)? 结果应该是

np.ifcondition(a[s]>0, a[s])  #array([2,  3,  4])

它看起来微不足道,但我无法找到一个简单而浓缩的表达方式。我敢肯定口罩可以,但对我来说看起来并不直接。 但是,两者都不是:

a[a[s]>0]
a[s[a[s]>0]]

其实都是不错的选择。

【问题讨论】:

  • np.clipnp.where 等大多数工具都保留了数组的原始大小,因此它们并不真正适合我的需要。

标签: python arrays numpy


【解决方案1】:

怎么样:

In [19]: b = a[s]

In [20]: b[b > 0]
Out[20]: array([2, 3, 4])

【讨论】:

  • 对! ...它似乎工作:我只需要定义一个新数组。
  • a[s][a[s] > 0] 也可以,但它会导致 numpy 重新计算 a[s] 两次。
  • 这是做这类事情的标准方法。 (+1 来自我)
  • 我可以将它用于条件,但也想设置包含 b 的所有元素的默认条件。我该如何设置? (我试图将它作为参数传递给函数,并希望将默认设置为包含所有)
【解决方案2】:

你绝对应该接受 unutbu 的回答,这是我在 numpy.但是为了有多种做事方式,有一个在 numpy 之外工作的方法,或者如果中间数组非常庞大,我将添加这个替代方案:

In [3]: [a[S] for S in s if a[S]>0]
Out[3]: [2, 3, 4]

同样,unutbu 的方法明显更快。但我喜欢这种方法,因为它可以进一步推广。如果您有一个昂贵的时髦函数(例如,没有索引),并且想要测试该函数的结果,您可能想要这样做:

In [5]: [f for S in s for f in [FunkyFunction(a[S])] if f>0]
Out[5]: [2, 3, 4]

关于这个的奇怪部分是你在另​​一个列表中创建了一个列表,但是这个内部列表只包含一个项目。基本上你正在做的是将值保存到变量f,然后使用该值两次:一次测试值(f>0),如果测试通过,一次在列表中使用该值。

【讨论】:

    【解决方案3】:

    我知道这是一个老问题,我不确定在被问到时是否有以下问题,但由于我带着类似的问题来到这里,这就是我发现的适用于我:

    np.extract(a[s] > 0, a[s])
    

    【讨论】:

    • extract 函数已经存在了很长时间——至少是 2009 年。由于a[s]>0 是一个布尔数组,文档说你的extract 表达式等同于a[s][a[s]>0] ,它已经被拒绝了,因为它计算了两次 a[s] - 你的也是。
    猜你喜欢
    • 1970-01-01
    • 2022-01-08
    • 2021-02-15
    • 2019-05-13
    • 2020-12-02
    • 2018-10-06
    • 1970-01-01
    • 2011-04-16
    相关资源
    最近更新 更多