我正在努力提高我对numpy功能的理解。我理解numpy.dot
的行为。我想了解numpy.outer
在numpy.dot
方面的行为。
根据这篇维基百科文章https://en.wikipedia.org/wiki/Outer_product,我希望array_equal在以下代码中返回True。但事实并非如此。
X = np.matrix([
[1,5],
[5,9],
[4,1]
])
r1 = np.outer(X,X)
r2 = np.dot(X, X.T)
np.array_equal(r1, r2)
如何分配r2以便np.array_equal
返回True?另外,为什么numpy的np.outer
实现与维基百科上的外部乘法定义不匹配?
使用numpy 1.9.2
答案 0 :(得分:3)
var anchor= document.querySelector('a[href="#addnotes"');
anchor.click();
Wiki外部链接主要讨论向量,1d数组。您的In [303]: X=np.array([[1,5],[5,9],[4,1]])
In [304]: X
Out[304]:
array([[1, 5],
[5, 9],
[4, 1]])
In [305]: np.inner(X,X)
Out[305]:
array([[ 26, 50, 9],
[ 50, 106, 29],
[ 9, 29, 17]])
In [306]: np.dot(X,X.T)
Out[306]:
array([[ 26, 50, 9],
[ 50, 106, 29],
[ 9, 29, 17]])
是2d。
X
请注意,Wiki外部不涉及求和。在这个例子中,内部确实In [310]: x=np.arange(3)
In [311]: np.outer(x,x)
Out[311]:
array([[0, 0, 0],
[0, 1, 2],
[0, 2, 4]])
In [312]: np.inner(x,x)
Out[312]: 5
In [313]: np.dot(x,x) # same as inner
Out[313]: 5
In [314]: x[:,None]*x[None,:] # same as outer
Out[314]:
array([[0, 0, 0],
[0, 1, 2],
[0, 2, 4]])
是外部的3个对角线值的总和。
5
也涉及求和 - 所有产品都按照特定轴进行求和。
一些维基外部方程使用显式指数。 dot
函数可以实现这些计算。
einsum
正如评论中所述,In [325]: np.einsum('ij,kj->ik',X,X)
Out[325]:
array([[ 26, 50, 9],
[ 50, 106, 29],
[ 9, 29, 17]])
In [326]: np.einsum('ij,jk->ik',X,X.T)
Out[326]:
array([[ 26, 50, 9],
[ 50, 106, 29],
[ 9, 29, 17]])
In [327]: np.einsum('i,j->ij',x,x)
Out[327]:
array([[0, 0, 0],
[0, 1, 2],
[0, 2, 4]])
In [328]: np.einsum('i,i->',x,x)
Out[328]: 5
使用np.outer
,例如
ravel
这与我之前为return a.ravel()[:, newaxis]*b.ravel()[newaxis,:]
演示的广播相同。
答案 1 :(得分:1)
numpy.outer仅适用于1-d向量,而不适用于矩阵。但对于1-d向量的情况,存在关系。
如果
import numpy as np
A = np.array([1.0,2.0,3.0])
然后这个
np.matrix(A).T.dot(np.matrix(A))
应与此相同
np.outer(A,A)
答案 2 :(得分:1)
与a[:,None] * a[None,:]
a.reshape(a.size, 1) * a.reshape(1, a.size)