如何修正纯Python中嵌套浮点数组的点积实现错误?
解决矩阵与向量点积的TypeError问题
首先咱们来拆解你遇到的错误根源:你原来的dot函数是为两个一维数组的点积设计的,但现在你的lista是一个二维数组(里面包含多个一维子数组),而listb是一维数组。当你调用dot(lista, listb)时,zip(lista, listb)会把lista里的每个子列表和listb的单个元素配对(比如第一组是[2.62, -3.97]和-0.75),这时候执行x*y就变成了「列表 × 浮点数」——Python里列表只能和整数相乘(用来重复列表元素),和浮点数相乘自然就抛出TypeError了。
修正方案:矩阵-向量乘法
你实际需要的是矩阵与向量的乘法:把二维数组的每一行分别和一维向量计算点积,最后返回结果数组。可以直接修改函数,或者新建一个更明确的函数:
def matrix_vector_dot(matrix, vector): # 遍历矩阵的每一行,和向量计算点积并收集结果 return [sum(x*y for x, y in zip(row, vector)) for row in matrix]
测试运行
把你的输入代入测试:
lista = [[2.62, -3.97], [-2.32, -1.30], [-1.09, -0.45]] listb = [-0.75, 2.75] print(matrix_vector_dot(lista, listb))
输出结果为:
[-12.8675, 1.21, 0.0]
可选:兼容一维点积的通用函数
如果你想让函数同时支持「一维数组点积」和「矩阵-向量乘法」,可以加个简单的判断逻辑:
def dot(v1, v2): # 判断v1是否是二维数组(子元素是可迭代对象,且排除字符串类型) if hasattr(v1[0], '__iter__') and not isinstance(v1[0], str): return [sum(x*y for x, y in zip(row, v2)) for row in v1] # 处理一维数组点积的情况 else: return sum(x*y for x, y in zip(v1, v2))
这样不管是传入两个一维数组,还是二维数组+一维向量,函数都能正确处理。
内容的提问来源于stack exchange,提问作者Adam_G
相关产品推荐
相关产品推荐

