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

glu*_*uke 22 python arrays numpy

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

import numpy as np
a = np.arange(-10,10)
Run Code Online (Sandbox Code Playgroud)

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

s = [9, 12, 13, 14]
Run Code Online (Sandbox Code Playgroud)

我可以选择以下元素:

a[s]  #array([-1,  2,  3,  4])
Run Code Online (Sandbox Code Playgroud)

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

np.ifcondition(a[s]>0, a[s])  #array([2,  3,  4])
Run Code Online (Sandbox Code Playgroud)

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

a[a[s]>0]
a[s[a[s]>0]]
Run Code Online (Sandbox Code Playgroud)

实际上是不错的选择.

unu*_*tbu 24

怎么样:

In [19]: b = a[s]

In [20]: b[b > 0]
Out[20]: array([2, 3, 4])
Run Code Online (Sandbox Code Playgroud)

  • `a [s] [a [s]> 0]`也有效,但它会导致numpy重新计算`a [s]`两次. (3认同)

Mik*_*ike 5

您一定应该接受unutbu的回答,这是我在numpy中通常用于这种情况的方法。但是为了有多种处理方式,可以使用一种在numpy之外运行的方法,或者在中间数组令人反感的情况下,我将添加以下替代方法:

In [3]: [a[S] for S in s if a[S]>0]
Out[3]: [2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

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

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

与此相关的怪异部分是您在另一个列表中创建了一个列表,但是此内部列表仅包含一个项目。基本上,您要做的就是将值保存到变量中f,然后两次使用该值:一次测试值(f>0),一次测试通过时在列表中使用该值。