Pythonista从数组中提取元素的方法

时间:2014-10-17 10:51:11

标签: python numpy

我正在编写一些Python代码行,执行以下操作:

我有两个数组a和b,b包含(非严格)增加的整数。

我想从b的值是20的倍数的值中提取但我不想要重复,在某种意义上,如果b具有值:...,40,40,41,。 ..我只希望第一个值在40而不是第二个值。

这就是a[b%20==0]不起作用的原因。

我一直在使用:

factors = [20*i for i in xrange(1,int(b[-1]/20 +1))]
sample = numpy.array([a[numpy.nonzero(b==factor)[0][0]] for factor in factors])

但它既慢又不太优雅。

有没有Pythonista'可爱'的方式呢?

3 个答案:

答案 0 :(得分:2)

a[(b % 20 == 0) & np.r_[True, np.diff(b) > 0]]

b % 20 == 0部分给出一个二进制掩码,选择b的所有元素为20. np.r_[True, np.diff(b) > 0]部分创建一个二元掩码,仅选择与前一个元素不同的元素(我们在开头明确添加一个True,因为第一个元素没有前一个元素)。将面具加在一起,瞧!

答案 1 :(得分:1)

我们假设我们创建了一个布尔数组,它标记了b上的唯一值:

c = np.zeros(b.shape, dtype=np.bool)
c[np.unique(b, return_index = True)[1]] = True

现在你可以做到:

a[np.logical_and(b % 20 == 0, c)]

答案 2 :(得分:0)

如果您的b已排序,则使用diff应该比使用unique快一点:

import numpy

a = numpy.random.random_integers(0, 1000, 1000)
b = numpy.random.random_integers(0, 1000, 1000)
b.sort()

subset = a[(numpy.diff(b) != 0) * (b[:-1]%20 == 0)]