为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

海绵宝宝撒 2022-05-24 10:38:00
我正在尝试采取阵列a = [1,5,4,5,7,8,9,8,4,13,43,42]和数组b = [3,5,6,2,7]我希望 b 成为 a 中的索引,例如一个新数组[a[b[0]], a[b[1]], a[b[2]], a[b[3]] ...]所以 b 中的值是 a 的索引。a 中有 500k 条目,b 中有 500k 条目(大约)。有没有一种快速的方法可以在 numpy 中启动所有核心来做到这一点?我已经在 for 循环中做得很好,它是 sloooooooowwwwww。编辑以澄清。该解决方案必须适用于 2D 和 3D 阵列。所以也许b = [(2,3), (5,4), (1,2), (1,0)]我们想要c = [a[b[0], a[b[1], ...]
查看完整描述

3 回答

?
慕娘9325324

TA贡献1783条经验 获得超5个赞

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


a[b]

这相当于:


[a[b[x]] for x in range(b.shape[0])]

但是,在更高维度的情况下,您需要为索引的每个维度提供单独的列表。这意味着,你不能这样做:


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

但你可以这样做:


b0, b1, b2 = zip(*b)

print(a[b0, b1, b2])

你也可以使用np.take:


print(np.take(a, b))


查看完整回答
反对 回复 2022-05-24
?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

并不是说它很快,但 numpy 的方式就是:

a[b]

输出:

数组([5, 8, 9, 4, 8])


查看完整回答
反对 回复 2022-05-24
?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

我通过为 numpy 编写一个名为 Tensor Weighted Interpolative Transfer 的 C 扩展来解决这个问题,以获得速度和多线程。在纯 python 中,每 200x100x3 图像缩放和淡入淡出需要 3 秒,而在具有 8 个内核的多线程 C 中,相同操作需要 0.5 毫秒。

核心 C 代码最终就像

t2[dstidxs2[i2] + doff1] += t1[srcidxs2[i2] + soff1] * w1 * ws2[i2];

其中 doff1 是目标数组中的偏移量等。 w1 和 ws2 是插值权重。所有代码都在 C 语言中进行了超优化以提高速度。(不是代码大小或可维护性)

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

如果所有权重均为 1.0,我预计未来会进一步优化,例如特殊情况。


查看完整回答
反对 回复 2022-05-24
  • 3 回答
  • 0 关注
  • 250 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号