假设您的意思是x
并且y
是两个具有不同维度的一维数组,并且您想要它们outer
差异的平方:
In [98]: x = np.arange(1,5); y = np.arange(5,8); x,y
Out[98]: (array([1, 2, 3, 4]), array([5, 6, 7]))
您(x-y)^2
可以通过以下方式轻松完成broadcasting
:
In [99]: (x[:,None]-y)**2
Out[99]:
array([[16, 25, 36],
[ 9, 16, 25],
[ 4, 9, 16],
[ 1, 4, 9]])
或者,如果我们制作:
In [100]: x1 = x[:,None] # (4,1) shape
In [101]: (x1-y)**2
Out[101]:
array([[16, 25, 36],
[ 9, 16, 25],
[ 4, 9, 16],
[ 1, 4, 9]])
那么你的二项式公式是:
In [103]: x1**2 - 2*x1*y+y**2
Out[103]:
array([[16, 25, 36],
[ 9, 16, 25],
[ 4, 9, 16],
[ 1, 4, 9]])
x
是 1d,所以x.T
不会改变任何东西。我认为您的目标是将(1,4)转换为(4,1)。
如果数组不同,比如 2d,你需要给出一个清晰的例子。
如果数组是“行向量”,则它们是等效的:
In [105]: x.shape, y.shape
Out[105]: ((1, 4), (1, 3))
In [106]: (x.T-y)**2
...
In [107]: x.T**2 - 2*x.T*y + y**2
编辑
寻找“二项式论坛矩阵”,我发现:
https://math.stackexchange.com/questions/2754278/binomial-formula-for-matrices
这谈论了很多关于矩阵是否是可交换的,等等。
我展示的是如何将基本的标量二项式公式逐元素应用于数组。(m,) 和 (n,) 形状的数组(有效地)扩展为 (m,n),并且按元素应用公式。基本运算符 '+-*' 都按元素应用,并使用broadcasting
.
您的问题和评论中不清楚的是什么x^2
,x.Tx
以及x.Ty
何时x
和y
是 2d。哪些是矩阵乘法,用numpy
( np.dot
)@
写成np.matmul
?
矩阵乘法对维度如何组合有特定的规则。A (3,2) @ (2,4) => (3,4),而 (2,4) @ (3,2) 会产生错误。
并且 (3,2) 不能与 (4,2) 为 +/-。可以扩展维度并产生(3,4,2)“外部”和或差。