【问题标题】:Can I calculate element-wise product using an np.matrix?我可以使用 np.matrix 计算元素乘积吗?
【发布时间】:2016-10-31 18:21:25
【问题描述】:

我知道我可以使用 .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 的另一个论据吗?

【问题讨论】:

  • 请注意,python 3.5 引入了 a @ b 运算符用于矩阵乘法,如果键入 a.dot(b) 让您感到沮丧。
  • .dot 是张量点积。至于 '"dot product" 通常是 element-wise' - 你能找到你分配给“dot product”的含义的参考吗?您是否将 matlab 的 .* 视为“点积”?
  • @Kirk 要回答您对该评论的问题:不,不要使用矩阵。使用数组。请参阅this 问题。
  • @Eric no - 除了我对学校矩阵代数的记忆之外,没有其他参考资料。我会修改问题。

标签: python arrays numpy matrix


【解决方案1】:

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

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

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

dot 这个名字确实有点误导,但np.dot 的文档清楚地表明:“对于二维数组,它相当于矩阵乘法”。严格来说,点积并没有为矩阵定义;逐元素乘法将是Frobenius inner product。

【讨论】:

  • 谢谢!作为熟悉 numpy 的人,您推荐使用数组还是矩阵方法?使用矩阵有什么好处吗?
  • @KirkBroadhurst:您真正需要矩阵的时间是,如果您使用一些仅应该乘以标量的非 numpy 感知第三方代码,并且您希望在该代码中进行乘法运算一个点积。
  • @KirkBroadhurst:嗯,这取决于你在做什么。如果你想做矩阵运算(比如做很多矩阵乘法),你会使用矩阵。如果您主要进行向量操作(即基于行或基于列的操作),则数组更有意义。
  • @BrenBarn:如果你要做很多矩阵乘法,你肯定只使用@矩阵乘法运算符吗?
  • @Eric:是的,如果你使用的是 Python 3.5,但不是每个人都这样。
【解决方案2】:

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

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

但np.dot 被泛化为使用 2(及更高)维数组。

MATLAB 从一开始就是基于二维矩阵构建的,矩阵乘积被视为最常见和基本的乘法。所以.* 符号被用于元素乘法。 . 也可以与+ 和其他运算符一起使用。

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 的子类,添加它是为了让任性的 MATLAB 用户更熟悉 numpy。与旧版本的 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]])

【讨论】:

    猜你喜欢
    • 2013-03-20
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 2021-10-04
    • 2011-11-01
    相关资源
    最近更新 更多