【问题标题】:Python: fastest way to map continuous coordinates to discrete grid?Python:将连续坐标映射到离散网格的最快方法?
【发布时间】:2020-07-07 15:40:45
【问题描述】:

将连续的(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) 的最快方法是什么?坐标?

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

【问题讨论】:

  • 如果网格是均匀分布的,np.round(coordinates/grid_size) 之类的就可以了。
  • 您能提供更多信息吗?例如,x-y 对是否已排序?

标签: python numpy image-processing coordinates coordinate-systems


【解决方案1】:

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

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) 数组上的广播操作将执行更少的缓存负载,因为正在处理的维度是连续的。

【讨论】:

  • 感谢您的澄清 - 我什至没有考虑过偏移部分,但这使解决方案更加通用。
猜你喜欢
  • 2021-02-22
  • 2017-08-31
  • 1970-01-01
  • 2013-07-16
  • 2012-07-26
  • 2019-12-29
  • 2021-10-28
  • 2020-08-09
  • 1970-01-01
相关资源
最近更新 更多