如何使用NumPy实现三维点云指定坐标范围的过滤操作
报错原因
- 你的
verts数组形状为(h, w, 3),最后一维依次存储x、y、z三个坐标值。原代码直接对整个verts数组做范围判断,得到的布尔数组形状也是(h, w, 3),沿axis=0做np.all后得到的布尔索引形状为(w, 3),和原数组的维度完全不匹配,因此触发维度不匹配的索引错误。 - 逻辑层面也存在问题:原写法会要求点的x、y、z三个坐标全部落在
[xmin, xmax]范围内,不符合你只筛选x、y坐标范围的需求。 - 额外注意:NumPy数组没有
length属性,统计元素数量需要用size属性,统计点数量可以看数组对应维度的shape值。
正确实现代码
import numpy as np verts = np.asarray(points.get_vertices(2)).reshape(h, w, 3) texcoords = np.asarray(points.get_texture_coordinates(2)) xmin = -0.25 xmax = 0.25 ymin = 0.0 ymax = 1.0 # 分别提取x、y坐标做范围判断,得到的布尔数组形状为(h, w),和前两维匹配 x_in_range = (verts[..., 0] >= xmin) & (verts[..., 0] <= xmax) y_in_range = (verts[..., 1] >= ymin) & (verts[..., 1] <= ymax) # 合并两个条件,得到符合要求的点的布尔索引 in_idx = x_in_range & y_in_range # 索引取值,得到的inbox形状为(符合条件的点数量, 3) inbox = verts[in_idx] # 打印总点数和筛选后的点数 print(f"总点数: {verts.shape[0] * verts.shape[1]}, 筛选后点数: {inbox.shape[0]}")
内容的提问来源于stack exchange,提问作者bluelemonade
相关产品推荐
相关产品推荐

