Numpy矩阵相减疑问:10×1向量与10×20矩阵可执行减法的原因及含义
Numpy不同形状数组减法运算规则说明
核心逻辑:Numpy广播机制
Numpy内置的广播(Broadcasting)机制允许不同形状的数组执行数值运算,运算前会自动对维度较小的数组做逻辑扩展,不需要额外复制数据就能完成维度匹配,大幅提升运算效率。
两种写法的差异原因
你最开始定义的v = [1,2,3,4,1,2,3,4,1,2]转换为Numpy数组后,默认形状是1维的(10,),和形状为(10,20)的2维矩阵X做减法时,会触发广播的维度匹配规则:从最后一个维度开始逐一校验兼容性,(10,)的最后一维长度是10,X的最后一维长度是20,两者互不相等也不为1,匹配失败直接报错。
当你执行v.reshape((10,1))后,v的形状变为2维的(10,1),此时和(10,20)的X做维度匹配:
- 第一维两者长度均为10,匹配成功
- 第二维v的长度为1,符合广播规则中「长度为1的维度自动扩展到和另一数组对应维度相同长度」的要求,因此可以正常执行运算。
运算结果的含义
最终得到的运算结果仍为10×20的矩阵,结果中第i行第j列的数值等于X[i,j] - v[i,0],等价于X矩阵的每一行所有元素,都减去v向量中对应行位置的元素。
可以参考以下小实例验证效果:
import numpy as np # 初始化参数 v = np.array([1,2,3,4,1,2,3,4,1,2]).reshape((10,1)) X = np.ones((10,20), dtype=int) # 生成元素全为1的10×20矩阵 # 执行减法 result = X - v # 验证结果:第0行全为 1-1=0,第1行全为1-2=-1,第2行全为1-3=-2,以此类推 print(result[0]) # 输出全0的长度为20的数组 print(result[1]) # 输出全-1的长度为20的数组
内容的提问来源于stack exchange,提问作者Hermi
相关产品推荐
相关产品推荐

