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()。
結果是這樣的:
在我的 10M 點的中等功率機器上,整個操作需要 6.4 秒,包括調用plt.imshow
和plt.colorbar
運行前的垃圾收集。
使用 IPython 中的單元魔法收集時間%%timeit
。
不管怎樣,你的工作時間遠低于 450 小時。即使您的坐標變換不是線性分箱,我希望只要正確地對其進行矢量化,您就可以在合理的時間內運行。此外,多重處理不太可能給您帶來巨大的提升,因為它需要復制數據。
添加回答
舉報