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

如何使用numpy.meshgrid统计每个网格单元内的(x,y,z)点云数据特征

点云网格统计实现方案(纯NumPy,百万级高效)

核心思路

放弃逐网格循环筛选的低效逻辑,采用向量化索引分配+分组统计的实现方式,时间复杂度仅为O(N)(N为点云数量),完全适配百万级点云处理需求。

实现代码

首先导入依赖、定义网格参数:

import numpy as np

# 测试数据直接使用你提供的lasx、lasy、lasz即可
# 定义网格分辨率
grid_size = 30
# 生成网格边界,额外补充最大值避免边界点丢失
binx = np.arange(lasx.min(), lasx.max() + grid_size, grid_size)
biny = np.arange(lasy.min(), lasy.max() + grid_size, grid_size)
xx, yy = np.meshgrid(binx, biny)

给每个点分配所属网格索引:

# 计算每个点所属的网格索引(0基)
ix = np.digitize(lasx, binx) - 1
iy = np.digitize(lasy, biny) - 1
# 过滤超出网格范围的异常点
valid_mask = (ix >= 0) & (ix < len(binx)-1) & (iy >=0) & (iy < len(biny)-1)
ix_valid = ix[valid_mask]
iy_valid = iy[valid_mask]
z_valid = lasz[valid_mask]

计算各类网格统计量:

# 生成一维分组索引,把二维网格压成一维方便统计
group_idx = iy_valid * (len(binx)-1) + ix_valid
n_groups = (len(binx)-1) * (len(biny)-1)

# 1. 网格内点数量统计
count = np.bincount(group_idx, minlength=n_groups).reshape(len(biny)-1, len(binx)-1)
# 2. 网格内z值总和
z_sum = np.bincount(group_idx, weights=z_valid, minlength=n_groups).reshape(len(biny)-1, len(binx)-1)
# 3. 网格内z值均值
z_mean = np.full_like(count, np.nan, dtype=np.float64)
mask = count > 0
z_mean[mask] = z_sum[mask] / count[mask]
# 4. 网格内z值标准差
z_sq_sum = np.bincount(group_idx, weights=z_valid**2, minlength=n_groups).reshape(len(biny)-1, len(binx)-1)
z_std = np.full_like(count, np.nan, dtype=np.float64)
z_std[mask] = np.sqrt(z_sq_sum[mask]/count[mask] - z_mean[mask]**2)

扩展说明

  • 输出的count/z_mean/z_std的形状与你生成的xx/yy网格一一对应,每个位置的数值就是对应网格单元的统计结果
  • 无点的网格默认填充np.nan,可根据需求修改为0或其他占位值
  • 若需要新增分类占比、角度均值等其他统计量,仅需新增对应维度的weights参数传入np.bincount即可,无需修改整体逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 12:54:02