NumPy中1d数组与2d数组相乘得到指定结果的计算逻辑
NumPy 二维数组与一维数组乘法的运算逻辑
你得到的一维输出是NumPy广播机制与向量点积规则共同作用的结果,具体规则和计算过程如下:
核心运算规则
- 先明确两个数组的基础属性:
- 二维数组
w形状为(5,5),即5行5列结构 - 一维数组
c形状为(5,),长度为5
- 二维数组
- 如果直接用
*做逐元素乘法,NumPy会自动触发广播机制:从数组最右侧维度开始对齐校验,两个数组最右侧维度长度均为5,满足广播兼容要求,会自动把一维数组c扩展为(5,5)形状的二维数组——扩展后的数组每一行都和原c完全一致,再和w对应位置的元素做逐元素相乘,得到5×5的中间结果。 - 你最终拿到长度为5的一维数组,说明你在逐元素相乘后沿列方向(
axis=0)做了求和聚合,或者直接使用了矩阵乘法c @ w(行向量乘矩阵):此时每个输出元素对应c和w的某一列的点积,也就是两个数组同位置元素相乘后求和。
具体计算逻辑
输出数组的第n个元素,对应w的第n列和c的点积:
- 第一个输出元素对应
w第一列[50,55,60,65,70]与c计算:50*c[0] + 55*c[1] + 60*c[2] + 65*c[3] +70*c[4] - 第二个输出元素对应
w第二列[51,56,61,66,71]与c计算:51*c[0] + 56*c[1] + 61*c[2] + 66*c[3] +71*c[4] - 后续元素以此类推。由于
w每一列的元素都比前一列同位置的元素大1,因此输出结果是公差为c所有元素之和的等差数列,和你给出的结果递增规律完全吻合。
注:你贴出的
c值计算出的理论结果和实际输出存在小幅偏差,大概率是贴出的c做了四舍五入近似,和代码运行时的实际值有精度差异。
易混淆点提醒
不要把该运算和w @ c(矩阵乘列向量)混淆:w @ c是沿行方向求和,每个输出对应w的一行和c的点积,虽然最终也是长度为5的一维数组,但数值结果完全不同。
内容的提问来源于stack exchange,提问作者user18220834
相关产品推荐
相关产品推荐

