我正在尝试获取数组
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], ...]
答案 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的特殊情况下。