我正在编写几行Python代码,执行以下操作:
我有两个数组a和b,b包含(非严格的)递增整数。
我想从a中提取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])但它既缓慢,又相当不雅。
有一种“可爱”的方式吗?
发布于 2014-10-17 11:09:58
a[(b % 20 == 0) & np.r_[True, np.diff(b) > 0]]b % 20 == 0部分提供了一个二进制掩码,它选择b的所有元素,这些元素的因子为20。np.r_[True, np.diff(b) > 0]部分创建了一个二进制掩码,它只选择与前一个元素不同的元素(我们在开头显式地添加了一个True,因为第一个元素没有前一个元素)。把面具加在一起看!
发布于 2014-10-17 11:03:38
假设我们创建一个布尔数组,标记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)]发布于 2014-10-17 11:25:55
如果您的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)]https://stackoverflow.com/questions/26423433
复制相似问题