如何判断Python中矩阵是一维还是二维?len(lst)含义辨析
问题:Python中判断矩阵维度(一维/二维)的报错与疑惑
我正在学习Python,做矩阵乘法时遇到了判断矩阵维度的问题。这里的矩阵都是整数构成的矩形结构,需要确定维度才能计算乘积((m,n) × (n,p) = (m,p))。核心疑问是:怎么区分len(lst)代表的是二维矩阵的行数,还是一维矩阵的列数?
尝试的方法及报错
我写了这段代码来判断维度:
def matrix_multiplication(H, lst): # your code here print(f'H {H}') print(f'lst {lst}') rA = len(H) cA = len(H[0]) if rA > 0 else 0 rB = len(lst) cB = len(lst[0]) if rB > 0 else 0 print(f'H: {rA}x{cA}') print(f'lst: {rB}x{cB}') return (H) A1 = [[0,1,0,1],[1,0,0,0],[1,0,1,1]] b1 = [1,1,1,0] c1 = matrix_multiplication(A1, b1) print('c1=', c1) assert c1 == [1,1,0] , 'Test 1 failed'
运行后报错:
H [[0, 1, 0, 1], [1, 0, 0, 0], [1, 0, 1, 1]] lst [1, 1, 1, 0] Traceback (most recent call last): File "c:\Users\Me\Documents\Learn\MS-CS\Foundations of Data Structures and Algorithms\assignment_week3.py", line 42, in <module> c1 = matrix_multiplication(A1, b1) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "c:\Users\Me\Documents\Learn\MS-CS\Foundations of Data Structures and Algorithms\assignment_week3.py", line 20, in matrix_multiplication cB = len(lst[0]) if rB > 0 else 0 ^^^^^^^^^^^ TypeError: object of type 'int' has no len()
解决思路
1. 先区分一维/二维矩阵
报错根源是:当传入一维列表(比如b1)时,lst[0]是整数,调用len()必然出错。所以第一步要先判断列表元素的类型:
- 若矩阵非空且
isinstance(mat[0], list),则是二维矩阵,len(mat)是行数,len(mat[0])是列数; - 否则是一维矩阵,需结合乘法场景定义为
n×1列向量或1×n行向量。
2. 适配乘法场景的维度判断
结合你的测试用例,A1是3×4的二维矩阵,b1是4元素的一维列表,这里要把b1当作4×1的列向量,这样才能满足3×4 ×4×1 =3×1的乘法规则,结果为一维列表。
可以先写一个获取维度的工具函数:
def get_matrix_dim(mat): if not mat: return (0, 0) # 判断是否为二维矩阵 if isinstance(mat[0], list): rows = len(mat) cols = len(mat[0]) if rows >0 else 0 return (rows, cols) else: # 一维矩阵默认当作列向量(n×1),可根据需求调整为行向量(1×n) return (len(mat), 1)
3. 修正矩阵乘法函数
基于维度判断,调整乘法逻辑:
def matrix_multiplication(H, lst): # 获取两个矩阵的维度 rA, cA = get_matrix_dim(H) rB, cB = get_matrix_dim(lst) # 检查乘法合法性:A的列数必须等于B的行数 if cA != rB: raise ValueError("矩阵无法相乘,A的列数不等于B的行数") # 初始化结果(这里处理二维×一维的情况,结果为一维列表) result = [0]*rA # 计算矩阵与列向量的乘积 for i in range(rA): total = 0 for j in range(cA): total += H[i][j] * lst[j] result[i] = total return result # 测试 A1 = [[0,1,0,1],[1,0,0,0],[1,0,1,1]] b1 = [1,1,1,0] c1 = matrix_multiplication(A1, b1) print('c1=', c1) assert c1 == [1,1,0] , 'Test 1 failed'
这段代码会正确输出预期结果[1,1,0]。
补充说明
如果要支持更通用的二维×二维矩阵乘法,只需在维度判断后补充对应的双重循环计算逻辑即可。核心规则始终是:
- 二维矩阵:
len(mat)对应行数,len(mat[0])对应列数; - 一维矩阵:根据乘法场景定义为
n×1或1×n,此时len(mat)就是对应的行数或列数。
内容的提问来源于stack exchange,提问作者likejudo
相关产品推荐
相关产品推荐

