1 条题解

  • 0
    @ 2026-3-26 21:45:40

    NUMPY016 题解:矩阵加边框

    题目

    给定一个二维矩阵,在其周围添加一圈值为 0 的边框。

    示例

    输入:              输出:
    [[1 2 3]     →   [[0 0 0 0 0]
     [4 5 6]]         [0 1 2 3 0]
                       [0 4 5 6 0]
                       [0 0 0 0 0]]
    

    解题思路

    1. 读取矩阵的行数和列数
    2. 读取原始矩阵数据
    3. 用 np.pad 添加边框

    代码

    import numpy as np
    
    rows, cols = map(int, input().split())
    arr = np.array([list(map(int, input().split())) for _ in range(rows)])
    Z = np.pad(arr, pad_width=1, mode='constant', constant_values=0)
    print(Z)
    

    代码详解

    第一步:读取行数和列数

    rows, cols = map(int, input().split())
    
    • input() 读取一行字符串
    • .split() 拆分成列表:["2", "3"]
    • map(int, ...) 转成整数
    • 结果:rows=2, cols=3

    第二步:读取矩阵

    arr = np.array([list(map(int, input().split())) for _ in range(rows)])
    

    这个有点复杂,一步一步拆开看:

    # 循环 2 次(因为 rows=2)
    for _ in range(2):
        # 每次读取一行,转成整数列表
        list(map(int, input().split()))
        # 例如输入 "1 2 3",得到 [1, 2, 3]
    
    # 最终得到 [[1,2,3], [4,5,6]]
    
    # np.array() 把列表转成数组
    arr = np.array([[1,2,3], [4,5,6]])
    

    第三步:添加边框(核心)

    Z = np.pad(arr, pad_width=1, mode='constant', constant_values=0)
    

    np.pad 详解

    np.pad() 用来给数组周围添加填充。

    参数说明

    np.pad(数组, pad_width, mode, constant_values)
    
    参数 说明 本题值
    数组 原数组 arr
    pad_width 每边填充多少 1
    mode 填充模式 'constant'
    constant_values 填充的值 0

    图解

    原数组 (2×3):
      1  2  3
      4  5  6
    
    添加边框后 (4×5):
      0  0  0  0  0    ← 上边框
      0  1  2  3  0    ← 左边框 + 原数组 + 右边框
      0  4  5  6  0
      0  0  0  0  0    ← 下边框
    

    pad_width 的更多用法

    # 四边各填1个
    np.pad(arr, 1)
    
    # 上下填1,左右填2
    np.pad(arr, (1, 2))
    
    # 分别指定四边 [上, 下], [左, 右]
    np.pad(arr, [[1, 2], [3, 4]])
    

    mode 的取值

    mode 说明 示例
    'constant' 常量填充(默认) constant_values=0
    'edge' 用边缘值填充 [1,2,3]→[1,1,2,3,3]
    'reflect' 对称反射 [1,2,3]→[3,2,1,2,3]
    'symmetric' 对称复制 [1,2,3]→[2,1,1,2,3,3,2]
    'replicate' 复制边缘 [1,2,3]→[1,1,1,2,3,3,3]

    其他实现方法

    方法2:手动创建大数组

    import numpy as np
    
    rows, cols = map(int, input().split())
    arr = np.array([list(map(int, input().split())) for _ in range(rows)])
    
    # 创建 (rows+2) × (cols+2) 的全0数组
    Z = np.zeros((rows + 2, cols + 2), dtype=int)
    
    # 把原数组放到中间
    Z[1:-1, 1:-1] = arr
    print(Z)
    

    原理

         列: 0  1  2  3  4
    行 0:  0  0  0  0  0    ← 不动
    行 1:  0  1  2  3  0    ← Z[1:-1, 1:-1] 放原数组
    行 2:  0  4  5  6  0
    行 3:  0  0  0  0  0    ← 不动
    

    方法3:逐边赋值

    import numpy as np
    
    rows, cols = map(int, input().split())
    arr = np.array([list(map(int, input().split())) for _ in range(rows)])
    
    Z = np.zeros((rows + 2, cols + 2), dtype=int)
    Z[1:-1, 1:-1] = arr    # 中间放原数组
    Z[0, :] = 0             # 上边框
    Z[-1, :] = 0            # 下边框
    Z[:, 0] = 0             # 左边框
    Z[:, -1] = 0            # 右边框
    print(Z)
    

    常见错误

    错误1:忘了转整数类型

    # 错误:字符串列表
    arr = np.array([input().split()])
    
    # 正确:整数列表
    arr = np.array([list(map(int, input().split()))])
    

    错误2:填充宽度不对

    # 错误:变成 (rows+1) × (cols+1)
    np.pad(arr, 0)
    
    # 正确:四周各填1个,变成 (rows+2) × (cols+2)
    np.pad(arr, 1)
    

    错误3:填充值写错

    # 错误:填充值写在 pad_width 位置
    np.pad(arr, 0, mode='constant', constant_values=0)
    
    # 正确:pad_width=1, 再指定填充值
    np.pad(arr, 1, mode='constant', constant_values=0)
    

    核心知识点

    知识点 说明
    map(int, list) 把字符串列表转成整数列表
    np.array(list) 把列表转成 numpy 数组
    np.pad() 给数组添加填充
    pad_width 填充宽度
    mode='constant' 常量填充模式
    constant_values 填充的常量值
    np.zeros() 创建全0数组
    切片 [1:-1, 1:-1] 取内部区域
    • 1

    信息

    ID
    457
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    3
    已通过
    1
    上传者