如何用Numpy优雅生成(w,h,3)维度的[x,y,z]坐标网格?
更优雅的Numpy实现方案
你可以利用Numpy的广播机制或者结合meshgrid的索引参数来简化代码,避免繁琐的tile/repeat操作,同时提升效率:
方法1:meshgrid + 维度扩展 + 拼接
利用meshgrid的indexing='ij'参数直接生成匹配(w,h)形状的网格数组,再扩展维度后拼接:
import numpy as np w, h = 6, 4 # 生成基础一维数组 x_arr = np.linspace(-1, 1, w) y_arr = np.linspace(-1, 1, h) # 生成(w,h)形状的网格,indexing='ij'确保维度匹配w行h列 X, Y = np.meshgrid(x_arr, y_arr, indexing='ij') # 扩展为(w,h,1)的单通道数组,方便后续拼接 X = X[..., np.newaxis] Y = Y[..., np.newaxis] z = np.ones((w, h, 1)) # 一次性拼接成(w,h,3)的坐标数组 xyz = np.concatenate([X, Y, z], axis=-1)
方法2:纯广播实现(最简洁)
直接通过维度扩展触发Numpy的广播机制,无需生成中间网格数组,代码更短且无冗余数据复制:
import numpy as np w, h = 6, 4 # 扩展维度让数组自动广播为(w,h,1) x_arr = np.linspace(-1, 1, w)[:, np.newaxis, np.newaxis] # shape (w,1,1) y_arr = np.linspace(-1, 1, h)[np.newaxis, :, np.newaxis] # shape (1,h,1) z = np.ones((w, h, 1)) # 拼接得到最终坐标数组 xyz = np.concatenate([x_arr, y_arr, z], axis=-1)
方案优势对比
- 避免了原方案中
tile/repeat导致的冗余数据复制,内存效率更高 - 代码逻辑更直观,直接对应坐标网格的生成逻辑
- 两种方法都能直接得到
(w,h,3)的目标数组,无需多次dstack嵌套操作
内容的提问来源于stack exchange,提问作者Johan
相关产品推荐
相关产品推荐

