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

如何判断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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 03:23:19