我试着用数组
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中有500 k项,b(大约)中有500 k项。有没有一个快速的方法来踢所有的核心在numpy做这件事?我已经在循环中做得很好了,而且它是血。
编辑以澄清。解决方案必须适用于2D和3D数组。所以也许
b = [(2,3), (5,4), (1,2), (1,0)]我们想要
c = [a[b[0], a[b[1], ...]发布于 2019-12-06 01:41:52
为了获得速度和多线程,我编写了一个对numpy的C扩展,称为张量加权Interpolative传输来解决这个问题。在纯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的话,我期望将来会有更多的优化,比如特殊情况。
发布于 2019-09-08 20:48:57
不是说它是快速的,但简单地说,粗野的方式是:
a[b]产出:
数组(5、8、9、4、8)
发布于 2019-09-08 22:47:38
这可以在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))https://stackoverflow.com/questions/57845633
复制相似问题