矩阵乘法与数组点积的区别
我刚开始学习Python,遇到了一个关于矩阵乘法的问题。我有两个列表:
A =[3.0,3.0]
# 1 by 2 matrix
B =[[ 50.33112583, -49.66887417],
[-49.66887417, 50.33112583]]
# 2 by 2 matrix
Result should be :
# 1 by 2 matrix
c = [1.9867549668874176, 1.986754966887446]
Right now I am doing:
>> A = numpy.matrix(A)
>> B = numpy.matrix(B)
>> C =A * B
>> C
matrix([[ 1.98675497, 1.98675497]])
>>C.tolist()
[[1.9867549668874176, 1.986754966887446]]
如果我进行点乘的话,
>>> B =numpy.array(B)
>>> B
array([[ 50.33112583, -49.66887417],
[-49.66887417, 50.33112583]])
>>> A = [ 3., 3.]
>>> A =numpy.array(A)
>>> A
array([ 3., 3.])
>>> C = numpy.dot(A,B)
>>> C
array([ 1.98675497, 1.98675497])
>>> C.tolist()
[1.9867549668874176, 1.986754966887446]
那么为什么在我使用矩阵乘法时会得到两个括号呢?点乘和矩阵乘法在这里是一样的吗?有人能给我解释一下吗?
1 个回答
5
当你使用 np.matrix()
时,它本身就是一个二维的容器,所以所有的操作都必须在二维的对象之间进行,并且结果也会是二维的:
np.matrix([[1,2,3], [4,5,6]])*[[1], [2], [3]]
#matrix([[14],
# [32]])
np.matrix([[1,2,3], [4,5,6]])*[1, 2, 3]
#ValueError
而当你使用 np.array()
时,如果在两个二维数组之间使用 dot()
,结果会是一个二维数组;但如果是在一个二维数组和一个一维数组之间,结果就会是一个一维数组:
np.array([[1,2,3], [4,5,6]]).dot([[1], [2], [3]])
#array([[14],
# [32]])
np.array([[1,2,3], [4,5,6]]).dot([1, 2, 3])
#array([14, 32])
如果你想进行逐元素的操作,使用更复杂和灵活的 广播规则 会很有帮助。比如说,你可以让每一行都乘以不同的数:
np.array([[1,2,3], [4,5,6]])*[[1], [2]]
#array([[ 1, 2, 3],
# [ 8, 10, 12]])
同样地,你也可以让每一列都乘以不同的数:
np.array([[1,2,3], [4,5,6]])*[1, 2, 3]
#array([[ 1, 4, 9],
# [ 4, 10, 18]])