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

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

如何并行寫入 numpy 數組中的同一單元格?

如何并行寫入 numpy 數組中的同一單元格?

LEATH 2023-10-11 16:23:06
背景:我在 2D 空間中有數百萬個點,(x_position, y_position, value)每個點都與之相關。我試圖通過創建圖像來總結這些點,其中每個像素可以包含多個點。總而言之,每個像素存儲圖像中value該位置處的 s之和。(x_pixel, y_pixel)問題:我怎樣才能有效地做到這一點?目前,我的代碼做了這樣的事情:image = np.zeros((4096,4096)) for each point in data:     x_pixel, y_pixel = convertPointPos2PixelPos(point)     image[x_pixel, y_pixel] += point.getValue()但完成此代碼的預計時間為 450 小時,這是不可接受的。有沒有辦法并行化這個?image[x,y]該代碼多次寫入同一索引。我發現 StackOverflow 帖子建議使用multiprocessing,但我認為需要lock防止競爭條件意味著這將花費與沒有并行化時一樣多的時間。
查看完整描述

1 回答

?
陪伴而非守候

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

假設您想要常規網格上的某些內容,您可以使用簡單的除法來對數據進行分類。這是一個例子:


size = (4096, 4096)

data = np.random.rand(100000000, 3)

image = np.zeros(size)


coords = data[:, :2]

min = coords.min(0)

max = coords.max(0)


index = np.floor_divide(coords - min, (max - min) / np.subtract(size, 1), out=np.empty(coords.shape, dtype=int), casting='unsafe')

index現在是一個索引數組,image您要在其中添加相應的值。您可以使用以下命令進行無緩沖添加np.add.at


np.add.at(image, tuple(index.T), data[:, -1])

如果您的數據范圍比僅坐標的邊界框定義得更好,則可以通過不計算coord.max()和來節省一些時間coord.min()。


結果是這樣的:

https://img1.sycdn.imooc.com/65265bb00001652104950407.jpg

在我的 10M 點的中等功率機器上,整個操作需要 6.4 秒,包括調用plt.imshowplt.colorbar運行前的垃圾收集。

使用 IPython 中的單元魔法收集時間%%timeit。

不管怎樣,你的工作時間遠低于 450 小時。即使您的坐標變換不是線性分箱,我希望只要正確地對其進行矢量化,您就可以在合理的時間內運行。此外,多重處理不太可能給您帶來巨大的提升,因為它需要復制數據。


查看完整回答
反對 回復 2023-10-11
  • 1 回答
  • 0 關注
  • 140 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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