31

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

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

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

s = [9, 12, 13, 14]

我可以从以下元素中选择元素:

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]]

其实都是不错的选择。

4

3 回答 3

33

怎么样:

In [19]: b = a[s]

In [20]: b[b > 0]
Out[20]: array([2, 3, 4])
于 2012-10-23T11:06:38.790 回答
5

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

于 2012-10-23T14:07:53.543 回答
1

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

np.extract(a[s] > 0, a[s])
于 2017-10-14T21:32:01.250 回答