NumPy中如何将ravel转换后的坐标列表还原为np.mgrid生成的x、y数组
从扁平化坐标列表还原np.mgrid生成的二维网格数组
实现原理
你生成坐标列表的流程,本质是对二维形态的x、y网格数组执行ravel()(默认采用行优先/C序拉平),再将两个拉平后的1D序列按列拼接为二维坐标数组。逆向操作不需要提前知道原始网格的尺寸、范围、步长,仅靠坐标列表本身即可完成无损还原。
可直接使用的还原函数
import numpy as np def foo(coords): # 拆分坐标列表中的x、y方向1D值序列 flat_x, flat_y = coords.T # 推断网格行列数:x方向唯一值数量=网格行数,y方向唯一值数量=网格列数 grid_rows = np.unique(flat_x).size grid_cols = np.unique(flat_y).size # 按原拉平顺序reshape回二维网格结构 restored_x = flat_x.reshape(grid_rows, grid_cols) restored_y = flat_y.reshape(grid_rows, grid_cols) return restored_x, restored_y
效果校验
可直接用你示例中的网格做测试,验证还原精度:
# 原始生成网格 x_original, y_original = np.mgrid[0:5:5j, 0:5:5j] # 生成坐标列表(与你提供的转换逻辑完全一致) coords = np.vstack((x_original.ravel(), y_original.ravel())).T # 调用还原函数 x_restored, y_restored = foo(coords) # 校验数组一致性 print(np.array_equal(x_original, x_restored)) # 输出 True print(np.array_equal(y_original, y_restored)) # 输出 True
适配说明
- 该方法完全匹配你示例中的转换逻辑,还原后的数组shape、数值与原始
np.mgrid输出无任何差异。 - 如果当初生成坐标列表时,拉平操作改用列优先(F序)规则,仅需要在reshape时传入
order='F'参数即可正常还原。
内容的提问来源于stack exchange,提问作者Jack Rolph
相关产品推荐
相关产品推荐

