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

如何将三维位置坐标数组按空间划分为多个子立方体块

你当前用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 19:24:03