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