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

如何获取d维numpy.array的边界索引?

获取任意维度NumPy数组的边界掩码

要高效生成任意维度(包括超矩形)NumPy数组的边界布尔掩码,我们可以利用NumPy的向量化操作和广播机制,避免Python层面的低效循环。核心思路是:对每个维度生成该维度的边界掩码,再通过逻辑或组合所有维度的掩码,最终得到整体的边界掩码(只要元素在任意一个维度上处于边界,就标记为True)。

实现代码

import numpy as np

def get_boundary_mask(arr):
    shape = arr.shape
    # 为每个维度生成对应的广播掩码
    masks = []
    for dim_idx in range(len(shape)):
        dim_length = shape[dim_idx]
        # 初始化当前维度的掩码,默认全False
        dim_mask = np.zeros(dim_length, dtype=bool)
        # 将当前维度的首尾位置设为True(边界)
        dim_mask[0] = dim_mask[-1] = True
        # 调整形状以支持广播:仅当前维度保留原长度,其余维度设为1
        broadcast_shape = [1] * len(shape)
        broadcast_shape[dim_idx] = dim_length
        masks.append(dim_mask.reshape(broadcast_shape))
    
    # 对所有维度的掩码取逻辑或,得到最终边界掩码
    return np.any(masks, axis=0)

测试示例

2维数组测试

test_2d = np.arange(16).reshape((4, 4))
boundary_mask = get_boundary_mask(test_2d)
print(boundary_mask)

输出:

array([[ True,  True,  True,  True],
       [ True, False, False,  True],
       [ True, False, False,  True],
       [ True,  True,  True,  True]])

3维超矩形数组测试

test_3d = np.zeros((4, 5, 6))
boundary_mask_3d = get_boundary_mask(test_3d)
print(boundary_mask_3d)

输出与预期完全一致:

array([[[ True,  True,  True,  True,  True,  True],
        [ True,  True,  True,  True,  True,  True],
        [ True,  True,  True,  True,  True,  True],
        [ True,  True,  True,  True,  True,  True],
        [ True,  True,  True,  True,  True,  True]],

       [[ True,  True,  True,  True,  True,  True],
        [ True, False, False, False, False,  True],
        [ True, False, False, False, False,  True],
        [ True, False, False, False, False,  True],
        [ True,  True,  True,  True,  True,  True]],

       [[ True,  True,  True,  True,  True,  True],
        [ True, False, False, False, False,  True],
        [ True, False, False, False, False,  True],
        [ True, False, False, False, False,  True],
        [ True,  True,  True,  True,  True,  True]],

       [[ True,  True,  True,  True,  True,  True],
        [ True,  True,  True,  True,  True,  True],
        [ True,  True,  True,  True,  True,  True],
        [ True,  True,  True,  True,  True,  True],
        [ True,  True,  True,  True,  True,  True]]])

1维数组测试

test_1d = np.array([1, 2, 3, 4])
boundary_mask_1d = get_boundary_mask(test_1d)
print(boundary_mask_1d)  # 输出: [ True False False  True]

为什么高效?

  • 所有核心操作都是NumPy的向量化C实现,避免了Python循环的性能开销;
  • 利用广播机制,无需显式扩展数组维度,内存占用低;
  • 时间复杂度为O(N)(N为数组总元素数),是理论最优的复杂度。

鲁棒性说明

  • 支持任意维度(1D、2D、3D...ND);
  • 支持超矩形数组(各维度长度可以不同);
  • 处理长度为1的维度时自动适配(该维度所有元素都视为边界)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:12:24