1 条题解
-
0
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]]
解题思路
- 读取矩阵的行数和列数
- 读取原始矩阵数据
- 用 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)参数 说明 本题值 数组原数组 arrpad_width每边填充多少 1mode填充模式 '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
- 上传者