猿问

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

我正在尝试采取阵列


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], ...]


海绵宝宝撒
浏览 251回答 3
3回答

慕娘9325324

这可以在 NumPy 中使用高级索引来完成。正如克里斯蒂安的回答所指出的那样,在一维情况下,您只需编写:a[b]这相当于:[a[b[x]] for x in range(b.shape[0])]但是,在更高维度的情况下,您需要为索引的每个维度提供单独的列表。这意味着,你不能这样做:a = np.random.randn(7, 8, 9)  # 3D arrayb = [(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))

料青山看我应如是

并不是说它很快,但 numpy 的方式就是:a[b]输出:数组([5, 8, 9, 4, 8])

ABOUTYOU

我通过为 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,我预计未来会进一步优化,例如特殊情况。
随时随地看视频慕课网APP

相关分类

Java
我要回答