为何x @ y.T与np.outer(x,y)输出不同?Numpy向量维度解析
为什么Numpy中一维数组的x @ y.T返回标量而非外积?
在Python的Numpy中,当x、y是一维数组时,预期x @ y.T会得到x与y的外积(和np.outer(x,y)结果一致),但实际返回的是标量。示例代码如下:
import numpy as np x = np.array([1,2]) y = np.array([3,4]) wrong_answer = x @ y.T right_answer = np.outer(x,y)
运行输出:
In [1]: wrong_answer Out[1]: 11 In [2]: right_answer Out[2]: array([[3, 4], [6, 8]])
核心原因
Numpy的一维数组是秩1数组,它既不是列向量也不是行向量。对一维数组执行转置y.T,得到的结果和原数组完全相同——因为它只有一个维度,转置操作不会改变其结构。
因此x @ y.T本质上是两个一维数组的点积(内积),计算逻辑为1*3 + 2*4 = 11,最终返回标量。
而np.outer(x,y)是专门设计用于计算外积的函数,它会自动将x视为列向量(形状(2,1))、y视为行向量(形状(1,2)),再执行矩阵乘法,从而得到2×2的外积结果。
用@运算符实现外积的正确方式
如果想用@得到外积,需要手动将一维数组转换为二维的列/行向量,比如:
# 方法1:用reshape转换维度 correct_outer = x.reshape(-1, 1) @ y.reshape(1, -1) # 方法2:用np.newaxis添加维度 correct_outer = x[:, np.newaxis] @ y[np.newaxis, :]
运行后correct_outer的结果与np.outer(x,y)完全一致:
array([[3, 4], [6, 8]])
内容的提问来源于stack exchange,提问作者ashman
相关产品推荐
相关产品推荐

