You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 11:47:46