Python NumPy矩阵运算@与*运算符差异及广播报错原因
NumPy矩阵运算中
@与*运算符的核心差异 你实验中用到的代码是线性回归求解参数的正规方程表达式,两个运算符的作用完全不同,具体区别如下:
*执行逐元素相乘
对NumPy中最常用的ndarray类型(也就是你通过pandas、numpy生成的常规二维数组),*会对两个数组相同位置的元素做一对一的乘法运算,也就是逐元素广播操作。
这个操作要求两个数组的形状满足广播匹配规则:要么形状完全一致,要么其中某一维度长度为1可自动扩展,不满足规则时就会抛出你遇到的operands could not be broadcast together with shapes报错。@执行标准线性代数矩阵乘法@是Python 3.5版本后专门为矩阵运算新增的运算符,对应NumPy中的np.matmul()方法,完全遵循线性代数的矩阵乘法规则:要求参与运算的前一个矩阵列数等于后一个矩阵的行数,运算结果形状为(前矩阵行数, 后矩阵列数)。
补充说明:如果你使用的是NumPy中已被官方弃用的
np.matrix类型,*会被重载为矩阵乘法,但当前做统计计算、数据处理的通用实践中均使用ndarray类型,这类场景下矩阵乘法统一使用@即可,不会出现逻辑错误。
你给出的代码片段thetaMatrix = np.linalg.inv(a.T@a) @ (a.T@b)中所有乘法都是严格的矩阵乘法,必须使用@运算符,替换为*会触发逐元素运算的广播规则校验,自然会抛出形状不匹配的报错。
内容的提问来源于stack exchange,提问作者ikmun
相关产品推荐
相关产品推荐

