Python:将连续坐标映射到离散网格的最快方法?

Python: fastest way to map continuous coordinates to discrete grid?

将连续 (x, y)(x, y, z) 坐标数据离散化到最近的网格坐标的最快方法是什么?

换句话说:将连续的欧氏位置 (6.778, 9.201) 转换为相应的网格坐标 (7, 9) 的最快方法是什么?例如,图像中的像素坐标?假设我有 100 个连续的 (x, y) 对和一个已知的 150 x 150 离散网格(例如 150^2 对 (0, 0), (1, 1), ...,等等——映射每个 (x, y) 对的最快方法是什么到最近的 (grid1, grid2) 坐标?

用谷歌搜索似乎没有给出太多结果,但我确定其他地方已经有人问过这个问题,所以如果这是多余的,请提前致歉。

最好的办法是根据间距和偏移来描述网格:

grid_offset = np.array([0.1, 0.3])
grid_spacing = np.array([1., 1.5])

在这个表示法中,我们取网格点位于

grid_offset + n * grid_spacing

对于给定的 (x, y) 对,您现在可以简单地计算最近的网格 index

point = np.array([x, y])
index = np.round((point - grid_offset) / grid_spacing)

要转换回网格坐标:

grid_offset + index * grid_spacing

如果您有大量对,请将阵列形状设为 (N, 2)(或 3,或您想要的任何维度)。这样,您就可以直接使用 (2,) 网格阵列进行广播:

points = np.array([[x1, y1], [x2, y2], ..., [xn, yn]])
gpoints = grid_offset + np.round((points - grid_offset) / grid_spacing) * grid_spacing

但是,最大的速度提升可能来自转置数组(或按 Fortran 顺序定义它们)。 (2, N)(2, 1) 数组的广播操作将执行更少的缓存加载,因为正在处理的维度是连续的。