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

时间:2019-09-08 20:45:04

标签: python 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的所有内核来做到这一点? 我已经在循环中很好用了,这是sloooooooowwwwww。

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

b = [(2,3), (5,4), (1,2), (1,0)]

我们想要

c = [a[b[0], a[b[1], ...]

3 个答案:

答案 0 :(得分:2)

并不是说速度很快,但是麻木的方法只是:

a[b]

输出:

  

array([5,8,9,4,8])

答案 1 :(得分:2)

这可以使用advanced indexing在NumPy中完成。正如Christian's answer所指出的,在一维情况下,您只需编写:

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))

答案 2 :(得分:0)

我通过为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的特殊情况下。