首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >索引numpy数组由其他数组作为索引

索引numpy数组由其他数组作为索引
EN

Stack Overflow用户
提问于 2019-09-08 20:45:04
回答 3查看 91关注 0票数 1

我试着用数组

代码语言:javascript
复制
a = [1,5,4,5,7,8,9,8,4,13,43,42]

和阵列

代码语言:javascript
复制
b = [3,5,6,2,7]

我希望b是a中的索引,例如,一个新数组

代码语言:javascript
复制
[a[b[0]], a[b[1]], a[b[2]], a[b[3]] ...]

因此,b中的值是a的索引,a中有500 k项,b(大约)中有500 k项。有没有一个快速的方法来踢所有的核心在numpy做这件事?我已经在循环中做得很好了,而且它是血。

编辑以澄清。解决方案必须适用于2D和3D数组。所以也许

代码语言:javascript
复制
b = [(2,3), (5,4), (1,2), (1,0)]

我们想要

代码语言:javascript
复制
c = [a[b[0], a[b[1], ...]
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-12-06 01:41:52

为了获得速度和多线程,我编写了一个对numpy的C扩展,称为张量加权Interpolative传输来解决这个问题。在纯python中,它是每200x100x3图像缩放和淡出3秒,而在具有8个核的多线程C中,相同的操作是0.5毫秒。

核心C代码的结果是

代码语言:javascript
复制
t2[dstidxs2[i2] + doff1] += t1[srcidxs2[i2] + soff1] * w1 * ws2[i2];

其中doff1是目标数组中的偏移量,w1和ws2是插值权值。所有的代码都是超优化在C中的速度。(不是代码大小或可维护性)

所有代码都可以在https://github.com/RMKeene/twit和PyPI上使用。

如果所有的权重都是1.0的话,我期望将来会有更多的优化,比如特殊情况。

票数 -1
EN

Stack Overflow用户

发布于 2019-09-08 20:48:57

不是说它是快速的,但简单地说,粗野的方式是:

代码语言:javascript
复制
a[b]

产出:

数组(5、8、9、4、8)

票数 2
EN

Stack Overflow用户

发布于 2019-09-08 22:47:38

这可以在NumPy中使用高级索引完成。正如克里斯蒂安的回答所指出的,在一维情况下,您只需写:

代码语言:javascript
复制
a[b]

这相当于:

代码语言:javascript
复制
[a[b[x]] for x in range(b.shape[0])]

然而,在高维情况下,需要为索引的每个维度分别列出列表.也就是说,你不能:

代码语言:javascript
复制
a = np.random.randn(7, 8, 9)  # 3D array
b = [(2, 3, 0), (5, 4, 1), (1, 2, 2), (1, 0, 3)]
print(a[b])  # this is incorrect

但你可以做到:

代码语言:javascript
复制
b0, b1, b2 = zip(*b)
print(a[b0, b1, b2])

您也可以使用np.take

代码语言:javascript
复制
print(np.take(a, b))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57845633

复制
相关文章

相似问题

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