我可以使用np.dot生成np.outer的结果吗?

时间:2015-11-09 20:44:36

标签: python numpy matrix-multiplication

我正在努力提高我对numpy功能的理解。我理解numpy.dot的行为。我想了解numpy.outernumpy.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

3 个答案:

答案 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)