Reshape Matrix(重塑矩阵)
题目链接:
Reshape Matrix(重塑矩阵)https://www.deep-ml.com/problems/3
题目描述:
难度:
easy(简单)。
分类:
Linear Algebra(线性代数)。
题目:
写一个 Python 函数,将给定的矩阵重塑为指定的形状。如果无法重塑,则返回一个空列表`[]`。
示例:
解释:
重塑矩阵。
矩阵重塑涉及改变矩阵的形状而不改变其数据。这在许多机器学习任务中至关重要,在这些任务中,输入数据需要以特定方式格式化。
例如,考虑矩阵 𝑀:
原始矩阵 M:
重塑后的矩阵 M',形状为(4, 2):
重要说明:确保在重塑过程中元素总数保持不变。
题目解析:
题解如下:
import numpy as np
def reshape_matrix(a: list[list[int|float]], new_shape: tuple[int, int]) -> list[list[int|float]]:
original_elements = len(a) * len(a[0]) if a else 0
new_elements = new_shape[0] * new_shape[1]
if original_elements != new_elements:
return []
np_array = np.array(a)
reshaped_np_array = np_array.reshape(new_shape)
return reshaped_np_array.tolist()
代码解释:
1. 元素总数校验:
重塑矩阵的前提是原始矩阵和目标形状的元素总数一致。通过计算 original_elements(原矩阵元素数)和 new_elements(新形状元素数),若不相等则直接返回空列表。
2. 矩阵重塑实现:
借助 NumPy 的 np.array(a) 将 Python 列表转换为 NumPy 数组,利用其高效的矩阵操作能力。
通过 reshape(new_shape) 按目标形状重新排列元素。
最后用 tolist() 将 NumPy 数组转回 Python 列表,满足函数返回格式要求。
注释版本:
import numpy as np
def reshape_matrix(a: list[list[int | float]], new_shape: tuple[int, int]) -> list[list[int | float]]:
# 计算原始矩阵的元素总数,处理原矩阵为空的情况避免索引错误
original_elements = len(a) * len(a[0]) if a else 0
# 计算新形状所需的元素总数(行数 × 列数)
new_elements = new_shape[0] * new_shape[1]
# 检查元素总数是否匹配,不匹配则无法重塑,返回空列表
if original_elements != new_elements:
return []
# 将输入列表转换为NumPy数组,以便使用矩阵重塑功能
np_array = np.array(a)
# 对数组进行重塑,应用指定的新形状
reshaped_np_array = np_array.reshape(new_shape)
# 将重塑后的NumPy数组转换回Python列表并返回
return reshaped_np_array.tolist()
思考总结:
核心逻辑分析:
矩阵重塑的前提是元素总数不变。因此,首先计算原矩阵元素总数(len(a) * len(a[0])
)和新形状元素总数(new_shape[0] * new_shape[1]
),若不相等直接返回空列表,确保重塑的可行性。工具应用:
借助 NumPy 的高效矩阵操作能力:将 Python 列表转换为 NumPy 数组(
np.array(a)
),利用其reshape
方法按指定形状重塑。最后通过
tolist()
将结果转回 Python 列表,满足函数返回格式要求。
边界与验证:
处理原矩阵为空的边界情况(
if a else 0
),避免索引错误。通过示例测试验证代码逻辑,确保输入输出符合预期,如将
2×4
矩阵重塑为4×2
时的正确转换。
本题通过 “元素总数校验 + NumPy 矩阵操作” 实现功能,先验证重塑的可能性,再借助工具完成重塑,最后验证代码鲁棒性,形成完整的解题逻辑。