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

如何在NumPy中创建带孔洞的meshgrid?

更优的带孔洞MeshGrid生成方法

这问题问得好!比起手动拼接8个矩形的方式,确实有更简洁、易维护的实现思路——先生成完整的网格点集,再通过条件筛选剔除孔洞区域的点。这种方法不仅代码更清晰,还能轻松适配不同形状、大小的孔洞,扩展性拉满。

先回顾你原来的基础网格生成代码

你之前的实现是这样的(我稍微调整了参数的可读性):

import numpy as np

low1 = -1; high1 = 1; n_p = 20
range1 = np.linspace(low1, high1, int(n_p/2), endpoint=False)
X = np.dstack(np.meshgrid(range1, range1)).reshape(-1, 2)

优化的带孔洞网格实现

核心是用布尔索引筛选点,步骤如下:

  1. 先生成覆盖整个区域的完整网格
  2. 定义孔洞的边界条件(矩形、圆形都可以)
  3. 保留不在孔洞内的点

矩形孔洞示例

假设你要的是中心区域为矩形孔洞,代码如下:

import numpy as np

# 全局区域参数
low1 = -1
high1 = 1
n_per_side = 20  # 每边的采样点数,对应你原来的n_p/2

# 1. 生成完整网格
range1 = np.linspace(low1, high1, n_per_side, endpoint=False)
x_grid, y_grid = np.meshgrid(range1, range1)
full_points = np.dstack([x_grid, y_grid]).reshape(-1, 2)

# 2. 定义矩形孔洞的范围(这里取中心[-0.5, 0.5]×[-0.5, 0.5])
hole_x_low, hole_x_high = -0.5, 0.5
hole_y_low, hole_y_high = -0.5, 0.5

# 3. 筛选:保留不在孔洞内的点
# 逻辑:只要x不在孔洞区间,或者y不在孔洞区间,就保留
mask = ~(
    (full_points[:, 0] >= hole_x_low) & 
    (full_points[:, 0] <= hole_x_high) & 
    (full_points[:, 1] >= hole_y_low) & 
    (full_points[:, 1] <= hole_y_high)
)
grid_with_hole = full_points[mask]

圆形孔洞扩展(可选)

如果需要圆形孔洞,只需要修改mask的条件即可,比如中心在原点、半径0.5的孔洞:

# 圆形孔洞条件:点到原点的距离≥0.5
mask = np.sqrt(full_points[:, 0]**2 + full_points[:, 1]**2) >= 0.5
grid_with_hole = full_points[mask]

为什么这个方法更好?

  • 代码简洁易读:不需要手动拆分多个矩形区域,逻辑一目了然
  • 扩展性强:修改孔洞的形状、大小、位置只需要调整条件,无需重构整个拼接逻辑
  • 性能更优:numpy的向量运算比循环拼接多个数组效率更高,尤其是当采样点数很大时

内容的提问来源于stack exchange,提问作者Vladislav Gladkikh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:25:59