必须有一种(非常)快速有效的方法来从一个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]]
实际上是不错的选择。
答案 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])