矩阵乘法与数组点积的区别

5 投票
1 回答
3828 浏览
提问于 2025-04-28 01:41

我刚开始学习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]])

撰写回答