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

3
什么是将连续的 (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) 坐标的最快方法是什么?
在谷歌上搜索似乎没有得到很多结果,但我相信这个问题在其他地方已经被问过了,所以如果这是冗余的,请提前道歉。

3
如果网格均匀分布,类似于 np.round(coordinates/grid_size) 的方法就可以奏效。 - Quang Hoang
你能提供更多信息吗?例如,x-y对是否已排序? - Mad Physicist
1个回答

4

你最好用间距和偏移量来描述网格:

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

在这种表示法中,我们将网格点视为位于

grid_offset + n * grid_spacing

对于给定的(x, y)坐标对,现在您可以轻松计算出最接近的网格索引,方法如下:

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)数组上进行广播操作,由于正在处理的维度的连续性,将会做更少的缓存加载。

谢谢您的澄清 - 我甚至没有考虑过偏移部分,但这使解决方案更通用。 - Conor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接