我可以使用np.matrix计算元素产品吗?

时间:2016-10-31 18:21:25

标签: python arrays numpy matrix

我知道我可以使用.dot语法使用numpy数组进行矩阵乘法。常规*乘法进行逐元素乘法。

a = np.array([[1,2],[3,4]])
print 'matrix multiplication', a.dot(a)
print 'element-wise multiplication', a * a

> matrix multiplication [[ 7 10]  [15 22]] 
> element-wise multiplication [[ 1  4]  [ 9 16]] 

这很好用,但它与我所学过的所有矩阵运算相反(即“点积”通常是元素方式,而常规乘积通常是全矩阵乘法。)

所以我正在调查np.matrix。好处是矩阵乘法使用*运算符,但我要理解如何进行逐元素乘法。

m = np.matrix(a)
print 'matrix multiplication', m * m
print 'more matrix multiplication? ', m.dot(m)

> matrix multiplication [[ 7 10]  [15 22]] 
> more matrix multiplication?  [[ 7 10]  [15 22]]

我理解发生了什么 - numpy矩阵没有.dot运算符,因此它落实到基础np.array实现。但这是否意味着无法使用np.matrix来计算点积?

这只是避免np.matrix而是坚持使用np.array的另一个论点吗?

2 个答案:

答案 0 :(得分:2)

您可以使用multiply函数进行元素乘法运算:

>>> np.multiply(m, m)
matrix([[ 1,  4],
        [ 9, 16]])

np.multiply(a, a)的结果相同。

名称dot确实有些误导,但np.dot的文档清楚地说:“对于二维数组,它等同于矩阵乘法”。严格来说,点积不是为矩阵定义的;元素乘法将是Frobenius inner product

答案 1 :(得分:2)

np.dot与向量的dot product(也称为标量积)一致

In [125]: np.arange(10).dot(np.arange(1,11))
Out[125]: 330

但是np.dot被推广为使用2(和更高)维数组。

MATLAB从一开始就构建在2d矩阵上,矩阵乘积被视为最常见和最基本的乘法。所以.*表示法用于元素乘法。 .也可以与+和其他运营商一起使用。

numpy中的基本结构是n-d数组。由于这样的数组可以具有0,1,2或更多维度,因此数学运算符被设计为以元素方式工作。提供np.dot来处理矩阵产品。有一个名为np.tensordot的变体。 np.einsum使用爱因斯坦符号(在物理学中很流行)。新的@运算符会调用np.matmul函数

In [131]: a.dot(a)
Out[131]: 
array([[ 7, 10],
       [15, 22]])
In [134]: np.einsum('ij,jk->ik',a,a)
Out[134]: 
array([[ 7, 10],
       [15, 22]])
In [135]: a@a
Out[135]: 
array([[ 7, 10],
       [15, 22]])
In [136]: np.matmul(a,a)
Out[136]: 
array([[ 7, 10],
       [15, 22]])

np.matrix是一个ndarray子类,并且被添加以使numpy对任性的MATLAB用户更为熟悉。像旧版本的MATLAB一样,它只能是2d。因此matrix计算的结果将始终为2d(或标量)。它的使用通常是气馁的,但我相信它会存在很长时间。 (我使用的sparse矩阵超过np.matrix)。

添加@运算符后,使用np.matrix的理由就更少了。

In [149]: m=np.matrix(a)
In [150]: m*m
Out[150]: 
matrix([[ 7, 10],
        [15, 22]])
In [151]: m@m
Out[151]: 
matrix([[ 7, 10],
        [15, 22]])
In [152]: m*m*m
Out[152]: 
matrix([[ 37,  54],
        [ 81, 118]])
In [153]: a@a@a
Out[153]: 
array([[ 37,  54],
       [ 81, 118]])