Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我能用np矩阵计算元素乘积吗?_Python_Arrays_Numpy_Matrix - Fatal编程技术网

Python 我能用np矩阵计算元素乘积吗?

Python 我能用np矩阵计算元素乘积吗?,python,arrays,numpy,matrix,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

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

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

>>> np.multiply(m, m)
matrix([[ 1,  4],
        [ 9, 16]])
对于
np,结果相同。乘以(a,a)


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

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

>>> np.multiply(m, m)
matrix([[ 1,  4],
        [ 9, 16]])
对于
np,结果相同。乘以(a,a)


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

矢量的
np.dot
点积(也称为标量积)一致

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。因此,
矩阵
计算的结果将始终是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]])

矢量的
np.dot
点积
(也称为标量积)一致

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。因此,
矩阵
计算的结果将始终是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]])

谢谢作为一个非常了解numpy的人,您建议使用数组还是矩阵方法?使用矩阵有什么好处吗?@KirkBroadhurst:你真正需要矩阵的时候是,如果你使用的是一些不支持numpy的第三方代码,它只应该乘以标量,而你希望在代码中的乘法是点积。@KirkBroadhurst:这取决于你在做什么。如果你想做矩阵运算(比如做很多矩阵乘法),你可以使用矩阵。如果你主要做的是向量运算(即基于行或基于列的运算),数组就更有意义了。@BrenBarn:如果你做的是大量的矩阵乘法,那么你肯定只需要使用
@
矩阵乘法运算符吗?@Eric:是的,如果你使用的是Python 3.5,而不是所有人都这么做。谢谢!作为一个非常了解numpy的人,您建议使用数组还是矩阵方法?使用矩阵有什么好处吗?@KirkBroadhurst:你真正需要矩阵的时候是,如果你使用的是一些不支持numpy的第三方代码,而这些代码应该只对标量进行乘法,而你希望在代码中的乘法是一个简单的过程