我正在编写一些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'可爱'的方式呢?
答案 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)]