首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从数组中提取元素的Pythonista方法

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

Stack Overflow用户
提问于 2014-10-17 10:51:10
回答 3查看 138关注 0票数 0

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

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

我想从a中提取b的值为20的倍数,但我不想重复,因为如果b有值:...,40,40,41,.我只想要第一个值,对应的是40,而不是第二个。

这就是为什么a[b%20==0]不能工作的原因。

我一直在用:

代码语言:javascript
复制
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])

但它既缓慢,又相当不雅。

有一种“可爱”的方式吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-10-17 11:09:58

代码语言:javascript
复制
a[(b % 20 == 0) & np.r_[True, np.diff(b) > 0]]

b % 20 == 0部分提供了一个二进制掩码,它选择b的所有元素,这些元素的因子为20。np.r_[True, np.diff(b) > 0]部分创建了一个二进制掩码,它只选择与前一个元素不同的元素(我们在开头显式地添加了一个True,因为第一个元素没有前一个元素)。把面具加在一起看!

票数 2
EN

Stack Overflow用户

发布于 2014-10-17 11:03:38

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

代码语言:javascript
复制
c = np.zeros(b.shape, dtype=np.bool)
c[np.unique(b, return_index = True)[1]] = True

现在你可以:

代码语言:javascript
复制
a[np.logical_and(b % 20 == 0, c)]
票数 1
EN

Stack Overflow用户

发布于 2014-10-17 11:25:55

如果您的b是排序的,使用diff应该比使用unique快一点。

代码语言:javascript
复制
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)]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26423433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档