在处理 numpy 数组时,运算符 "numpy.dot()"、“*”和“@”之间有什么区别?
What is the difference between operators "numpy.dot()", " * " and "@" when working on numpy arrays?
我想用 python 求解方程 x+6y−z=0、x+2y−2z=1、−5x+2z=8。
我尝试使用不同的乘法运算来乘法矩阵,当不同的乘法运算时答案是不同的used.I想知道这个的原因。
import numpy as np
a= np.array([[2,6,-1],[1,2,-2],[-5,0,2]])
b= np.array([0,1,8])
a_inv= np.linalg.inv(a)
#case1
c= np.dot(a_inv,b)
print(c.shape)
#case2
print((a_inv@b).shape)
#case3
print((a_inv*b).shape)
case1 和 case2 给出了正确的输出,但 case3 没有。
输出:
情况1:
(3,)
案例2:
(3,)
案例三:
(3, 3)
numpy 中的 *
运算符不同于矩阵乘法。当您执行 a_inv * b
(在您的情况下)时,您正在创建一个 3x3 数组,如下所示:
[[a[0,0] * b[0], a[0,1] * b[0], a[0,2] * b[0]],
[a[1,0] * b[1], a[1,1] * b[1] ...]] #etc.
除了 dot
之外,您还可以使用 np.matmul(a_inv, b)
进行矩阵乘法,或者您可以使用 np.matrix
:
明确告诉 numpy 您的数组是矩阵
a_inv = np.matrix(a_inv)
b = np.matrix(b).T # note that b will be a row vector, so you need to transpose it to make it a column vector
a_inv * b #now numpy will interpret '*' as matrix multiplication
>>[[-2. ]
[ 0.5]
[-1. ]]
我想用 python 求解方程 x+6y−z=0、x+2y−2z=1、−5x+2z=8。 我尝试使用不同的乘法运算来乘法矩阵,当不同的乘法运算时答案是不同的used.I想知道这个的原因。
import numpy as np
a= np.array([[2,6,-1],[1,2,-2],[-5,0,2]])
b= np.array([0,1,8])
a_inv= np.linalg.inv(a)
#case1
c= np.dot(a_inv,b)
print(c.shape)
#case2
print((a_inv@b).shape)
#case3
print((a_inv*b).shape)
case1 和 case2 给出了正确的输出,但 case3 没有。 输出: 情况1: (3,) 案例2: (3,) 案例三: (3, 3)
numpy 中的 *
运算符不同于矩阵乘法。当您执行 a_inv * b
(在您的情况下)时,您正在创建一个 3x3 数组,如下所示:
[[a[0,0] * b[0], a[0,1] * b[0], a[0,2] * b[0]],
[a[1,0] * b[1], a[1,1] * b[1] ...]] #etc.
除了 dot
之外,您还可以使用 np.matmul(a_inv, b)
进行矩阵乘法,或者您可以使用 np.matrix
:
a_inv = np.matrix(a_inv)
b = np.matrix(b).T # note that b will be a row vector, so you need to transpose it to make it a column vector
a_inv * b #now numpy will interpret '*' as matrix multiplication
>>[[-2. ]
[ 0.5]
[-1. ]]