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

如何计算扁平化(1D)3D数组中任意指定索引的相邻索引

扁平化三维数组的相邻索引计算方法

核心思路

要计算扁平索引的相邻索引,核心是先把扁平索引转换为三维坐标,再生成六个方向的相邻坐标,最后转回扁平索引并过滤无效值。

1. 明确数组的扁平化顺序

假设你的数组是按 X轴→Y轴→Z轴 的顺序扁平化的(即先遍历X方向所有元素,再遍历Y方向,最后遍历Z方向),这和你给出的示例完全匹配:

  • 数组总长度 = Width * Height * Depth
  • 三维坐标 (x, y, z) 转扁平索引公式:
    index = x + y * Width + z * Width * Height
    
  • 扁平索引 index 转三维坐标公式:
    x = index % Width
    y = (index // Width) % Height
    z = index // (Width * Height)
    

2. 生成六个相邻方向的坐标

三维空间中每个点有6个相邻点,对应三个轴的正负偏移:

  • (x+1, y, z) → X轴正方向
  • (x-1, y, z) → X轴负方向
  • (x, y+1, z) → Y轴正方向
  • (x, y-1, z) → Y轴负方向
  • (x, y, z+1) → Z轴正方向
  • (x, y, z-1) → Z轴负方向

3. 过滤无效坐标并转换回扁平索引

对每个相邻坐标,检查是否在有效范围内:

  • 0 ≤ x < Width
  • 0 ≤ y < Height
  • 0 ≤ z < Depth
    符合条件的坐标,用上述公式转回扁平索引,收集起来就是最终结果。

示例验证(Width=4, Height=4, Depth=4)

情况1:传入索引0

  • 转换为三维坐标:x=0%4=0,y=(0//4)%4=0,z=0//16=0 → (0,0,0)
  • 相邻坐标有效性检查:
    • (1,0,0) → 有效,对应索引1
    • (-1,0,0) → 无效
    • (0,1,0) → 有效,对应索引4
    • (0,-1,0) → 无效
    • (0,0,1) → 有效,对应索引16
    • (0,0,-1) → 无效
  • 最终结果:[1,4,16],和示例一致。

情况2:传入索引26

  • 转换为三维坐标:x=26%4=2,y=(26//4)%4=6%4=2,z=26//16=1 → (2,2,1)
  • 相邻坐标转索引:
    • (3,2,1) → 有效,对应索引27
    • (1,2,1) → 有效,对应索引25
    • (2,3,1) → 有效,对应索引30
    • (2,1,1) → 有效,对应索引22
    • (2,2,2) → 有效,对应索引42
    • (2,2,0) → 有效,对应索引10
  • 最终结果:[27,25,30,22,42,10](元素和示例一致,顺序不影响)

实现代码示例(Python)

def get_neighbors(index, width, height, depth):
    # 转换为三维坐标
    x = index % width
    y = (index // width) % height
    z = index // (width * height)
    
    neighbors = []
    # 遍历六个方向偏移
    directions = [(1,0,0), (-1,0,0), (0,1,0), (0,-1,0), (0,0,1), (0,0,-1)]
    for dx, dy, dz in directions:
        nx, ny, nz = x + dx, y + dy, z + dz
        # 检查坐标是否在有效范围内
        if 0 <= nx < width and 0 <= ny < height and 0 <= nz < depth:
            # 转回扁平索引
            neighbor_idx = nx + ny * width + nz * width * height
            neighbors.append(neighbor_idx)
    return neighbors

# 测试示例
print(get_neighbors(0, 4, 4, 4))  # 输出 [1,4,16]
print(get_neighbors(26, 4, 4, 4)) # 输出 [27,25,30,22,42,10]

注意事项

  • 如果你的数组扁平化顺序不同(比如Z轴优先),只需调整坐标与索引的转换公式,核心逻辑保持不变。
  • 函数需要提前获取数组的Width、Height、Depth参数,这是计算的基础。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 15:22:39