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 小时。即使您的坐标变换不是线性分箱,我希望只要正确地对其进行矢量化,您就可以在合理的时间内运行。此外,多重处理不太可能给您带来巨大的提升,因为它需要复制数据。
添加回答
举报