亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

由其他數組索引numpy數組作為索引

由其他數組索引numpy數組作為索引

海綿寶寶撒 2022-05-24 10:38:00
我正在嘗試采取陣列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 中啟動所有核心來做到這一點?我已經在 for 循環中做得很好,它是 sloooooooowwwwww。編輯以澄清。該解決方案必須適用于 2D 和 3D 陣列。所以也許b = [(2,3), (5,4), (1,2), (1,0)]我們想要c = [a[b[0], a[b[1], ...]
查看完整描述

3 回答

?
慕娘9325324

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


查看完整回答
反對 回復 2022-05-24
?
料青山看我應如是

TA貢獻1772條經驗 獲得超8個贊

并不是說它很快,但 numpy 的方式就是:

a[b]

輸出:

數組([5, 8, 9, 4, 8])


查看完整回答
反對 回復 2022-05-24
?
ABOUTYOU

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,我預計未來會進一步優化,例如特殊情況。


查看完整回答
反對 回復 2022-05-24
  • 3 回答
  • 0 關注
  • 243 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號