如何将三维位置坐标数组按空间划分为多个子立方体块
你当前用np.meshgrid的思路效率极低,不适合800万+量级的点坐标分箱,更推荐用np.digitize直接计算每个点所属的子立方体索引,实现复杂度低、运算速度快。
实现方案
核心逻辑
将三维坐标的x、y、z三个维度分别做等宽分箱,每个维度的分箱索引组合即为对应子立方体的唯一标识,直接按索引提取所属点即可。
完整代码示例
import numpy as np # 替换为你实际的坐标数组 coords = np.array([ [224.90635586, 720.494766 , 19.40263367], [491.25279546, 41.26026654, 7.35436416], [407.70436788, 340.32618713, 328.88192913] # 剩下的800多万条数据 ]) # 配置参数 cube_range = 787.5 # 大立方体边界 n_split = 10 # 每条边的切分份数 bin_width = cube_range / n_split # 生成分箱边界,最后加极小值避免边界点索引溢出 bins = np.arange(0, cube_range + 1e-8 + bin_width, step=bin_width) # 计算每个点三个维度的分箱索引(从0开始) x_idx = np.digitize(coords[:, 0], bins) - 1 y_idx = np.digitize(coords[:, 1], bins) - 1 z_idx = np.digitize(coords[:, 2], bins) - 1 # 三维索引转一维索引,方便快速分组 flat_idx = x_idx * n_split **2 + y_idx * n_split + z_idx # 按子立方体分组存储点 sub_cubes = {} for i in range(n_split): for j in range(n_split): for k in range(n_split): target_idx = i * n_split**2 + j * n_split + k sub_cubes[(i, j, k)] = coords[flat_idx == target_idx]
结果使用说明
sub_cubes字典的key为子立方体的三维索引(x序号, y序号, z序号),从(0,0,0)到(9,9,9),value即为该子立方体内的所有质点坐标数组。
原有思路问题说明
你用np.meshgrid生成的是所有网格顶点的坐标,无法直接匹配点所属的子立方体范围,后续需要额外做区间判断,会产生大量冗余计算,800万点场景下耗时会是上述方案的数十倍,不推荐使用。
内容的提问来源于stack exchange,提问作者Sam K
相关产品推荐
相关产品推荐

