3 回答

TA貢獻1783條經驗 獲得超4個贊
這可以在 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,我預計未來會進一步優化,例如特殊情況。
添加回答
舉報