仅获取满足numpy数组中条件的那些值

时间:2012-10-23 11:03:27

标签: python arrays numpy

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

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

现在,如果我有一个清单:

s = [9, 12, 13, 14]

我可以从:

中选择元素
a[s]  #array([-1,  2,  3,  4])

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

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

它看起来微不足道,但我无法找到一个简单而浓缩的表达。我确定面具会做,但它看起来并不直接对我来说。 但是,两者都没有:

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

实际上是不错的选择。

3 个答案:

答案 0 :(得分:20)

怎么样:

In [19]: b = a[s]

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

答案 1 :(得分:4)

你绝对应该接受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),一次在列表中使用该值,如果测试通过。

答案 2 :(得分:1)

我知道这是一个老问题,我不确定在被问及时是否有以下内容可用,但是因为我带着类似的问题来到这里,这就是我的意思发现这对我有用:

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