3 回答

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

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,我预计未来会进一步优化,例如特殊情况。
添加回答
举报