首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以使用np.matrix计算按元素划分的产品吗?

我可以使用np.matrix计算按元素划分的产品吗?
EN

Stack Overflow用户
提问于 2016-10-31 18:21:25
回答 2查看 2.1K关注 0票数 0

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

代码语言:javascript
复制
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。好的是矩阵乘法使用了*运算符,但是我要了解如何进行按元素方向的乘法。

代码语言:javascript
复制
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的论点吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-31 18:33:00

您可以使用multiply函数获得元素级乘法:

代码语言:javascript
复制
>>> np.multiply(m, m)
matrix([[ 1,  4],
        [ 9, 16]])

对于np.multiply(a, a),结果是一样的。

dot这个名字确实有点误导,但是np.dot的文档清楚地写着:“对于二维数组,它等同于矩阵乘法”。严格地说,点积不是为矩阵定义的,元素乘法是Frobenius内积

票数 2
EN

Stack Overflow用户

发布于 2016-10-31 20:50:44

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

代码语言:javascript
复制
In [125]: np.arange(10).dot(np.arange(1,11))
Out[125]: 330

但是np.dot被推广到与二维(和高维)数组一起工作。

MATLAB从一开始就建立在2d矩阵上,矩阵积被看作是最常见和最基本的乘法。因此,.*表示法被用于按元素进行乘法。.也可以与+和其他操作符一起使用。

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

代码语言:javascript
复制
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的原因就少了一个。

代码语言:javascript
复制
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]])
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40348173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档