Numpy函数不区分点积和矩阵乘法

Numpy function not differentiating between dot product and matrix multiplication

例如,我有一个适用于一维向量的投影矩阵方程:

其中P是投影矩阵,T是转置。

我们知道我们不能进一步简化这个分数(通过取消项),因为分母是点积(因此是 0 维标量,数字)而分子是矩阵(列乘以行是矩阵)。

我不确定如何在 numpy 中为这个方程定义函数,考虑到我使用的当前函数不区分这些项,乘法被视为具有可交换性 属性 .我正在使用 numpy.multiply 方法:

>>> import numpy as np
>>> a = np.array(a)
>>> a*a.T
array([1, 4, 9])
>>> a.T*a  
array([1, 4, 9])

如你所见,它们都输出向量。

我也尝试过使用 numpy.matmul 方法:

>>> np.matmul(a, a.T)
14
>>> np.matmul(a.T, a)
14

它给出了两个函数调用的点积。

我也试过 numpy.dot 但它显然不适用于分子项。

根据我的理解,第一个函数调用应该输出矩阵(因为列乘以行),第二个函数调用应该在适当的情况下输出标量。

我错了吗?有什么方法可以区分 a 乘以 a 转置和 a 转置乘以 a?

谢谢!

请注意,一维 numpy 数组 不是 列向量(转置等操作没有意义)。如果要获得列向量,则应将数组定义为二维数组(第二维大小等于 1)。

但是,您不需要定义列向量,因为 numpy 提供了函数来通过如下操作一维数组来执行您想要的操作

P = np.outer(a,a)/np.inner(a,a)

Stelios 的答案无疑是最好的,但为了完整起见,您可以对二维数组使用 @ 运算符:

a = np.array([1,4,9])[np.newaxis]

P = (a.T @ a) / (a @ a.T)