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)
例如,我有一个适用于一维向量的投影矩阵方程:
其中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)