我能用np.dot生成np.outer的结果吗?

2024-05-15 04:36:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在努力提高对numpy函数的理解。我了解numpy.dot的行为。我想了解numpy.outernumpy.dot方面的行为。

根据维基百科的这篇文章https://en.wikipedia.org/wiki/Outer_product,我希望array_等于在下面的代码中返回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实现与Wikipedia上的外部乘法定义不匹配?

使用numpy 1.9.2


Tags: 函数httpsorgnumpytruenpequalwikipedia
3条回答

numpy.outer只适用于一维向量,不适用于矩阵。但是对于一维向量的情况,有一个关系。

如果

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)

另一个类似于a[:,None] * a[None,:] 的(笨拙的)版本

a.reshape(a.size, 1) * a.reshape(1, a.size)
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]])

Wiki外部链接主要讨论向量、一维数组。你的X是二维的

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]])

请注意,Wiki外部不涉及求和。在这个例子中,5是外部的3个对角线值的和。

dot还涉及求和-沿着特定轴求和之后的所有乘积。

一些wiki外部方程式使用显式索引。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,:]

这与我之前为x演示的广播乘法相同。

相关问题 更多 >

    热门问题