为何Numpy中两数组点积得标量,与转置数组点积得矩阵?
问题解释:NumPy中np.dot对一维数组与二维数组的不同行为
首先要明确:你定义的a = np.array([1,2,3,4])是一维数组(shape为(4,)),不是线性代数里的1×4矩阵(shape应为(1,4))。NumPy对一维数组和二维数组的np.dot处理逻辑完全不同:
1. 两个一维数组的np.dot:计算向量内积
当a和b都是一维数组时,np.dot(a, b)执行的是向量的内积运算,对应数学里的点积公式:$\sum_{i=0}^{n-1}a_i b_i$,结果是一个标量。这和线性代数中向量的内积规则一致,所以不会报错,得到的30就是1×1 + 2×2 + 3×3 +4×4的结果。
2. 一维数组与二维列向量的np.dot:执行矩阵乘法
当b被reshape(-1,1)转换成二维数组(shape为(4,1),即4×1列向量)时,np.dot(a, b)会自动将一维数组a视为1×4的行矩阵,然后执行标准的矩阵乘法:1×4矩阵 × 4×1矩阵 = 1×1矩阵,所以结果是array([[30]]),符合你对矩阵乘法的预期。
验证你的线性代数认知:真正的1×4矩阵相乘会报错
如果要创建线性代数意义上的1×4矩阵,需要用二维数组定义:
a = np.array([[1,2,3,4]]) # shape (1,4) b = np.array([[1,2,3,4]]) # shape (1,4) np.dot(a, b) # 这里会报错,因为1×4矩阵和1×4矩阵无法进行矩阵乘法
这时候就会触发你预期的错误,因为矩阵乘法要求第一个矩阵的列数等于第二个矩阵的行数,而1≠4,不符合规则。
总结:核心区别在于NumPy的一维数组不是矩阵,np.dot对一维数组执行内积,对二维数组执行矩阵乘法。
内容的提问来源于stack exchange,提问作者user8473984
相关产品推荐
相关产品推荐

