【问题标题】:numpy matrix multiplication shapes [duplicate]numpy矩阵乘法形状[重复]
【发布时间】:2013-08-17 19:31:21
【问题描述】:

在矩阵乘法中,假设A 是一个 3 x 2 矩阵(3 行 2 列)并且B 是一个 2 x 4 矩阵(2 行 4 列),那么如果一个矩阵 @987654323 @,然后C 应该有 3 行和 4 列。为什么numpy不做这个乘法?当我尝试以下代码时,出现错误:ValueError: operands could not be broadcast together with shapes (3,2) (2,4)

a = np.ones((3,2))
b = np.ones((2,4))
print a*b

我尝试转置 A 和 B 并且总是得到相同的答案。为什么?这种情况下怎么做矩阵乘法?

【问题讨论】:

    标签: python numpy matrix-multiplication


    【解决方案1】:

    numpy 数组的 * 运算符是元素乘法(类似于相同维度数组的 Hadamard 乘积),而不是矩阵乘法。

    例如:

    >>> a
    array([[0],
           [1],
           [2]])
    >>> b
    array([0, 1, 2])
    >>> a*b
    array([[0, 0, 0],
           [0, 1, 2],
           [0, 2, 4]])
    

    对于矩阵乘法与 numpy 数组:

    >>> a = np.ones((3,2))
    >>> b = np.ones((2,4))
    >>> np.dot(a,b)
    array([[ 2.,  2.,  2.,  2.],
           [ 2.,  2.,  2.,  2.],
           [ 2.,  2.,  2.,  2.]])
    

    另外你可以使用矩阵类:

    >>> a=np.matrix(np.ones((3,2)))
    >>> b=np.matrix(np.ones((2,4)))
    >>> a*b
    matrix([[ 2.,  2.,  2.,  2.],
            [ 2.,  2.,  2.,  2.],
            [ 2.,  2.,  2.,  2.]])
    

    更多关于广播numpy数组的信息可以找到here,更多关于矩阵类的信息可以找到here

    【讨论】:

    • 应该小心定义“LinearOperator”类的 sparse.linalg numpy 扩展。在此类中,“*”运算符被解释为通常的矩阵点积。
    • 什么时候应该在 numpy 矩阵和数组中使用?直到最近我才意识到有一个矩阵 API。
    • @CharlieParker 我不建议使用矩阵,我相信它们将被弃用。
    猜你喜欢
    • 2014-03-01
    • 2020-05-08
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多