如何使用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
相关产品推荐
相关产品推荐

