【问题标题】:why does numpy.dot is fault for numpy.dot(a,b) but has output for numpy.dot(b,a)?为什么 numpy.dot 对 numpy.dot(a,b) 有错,但对 numpy.dot(b,a) 有输出?
【发布时间】:2016-10-01 10:42:11
【问题描述】:

我试图理解为什么 numpy 的 dot 函数会这样:

t1 = np.array( [1, 0] )
t2 = np.array( [ [7,6],
                 [7,6],
                 [7,6],
                 [7,6]] )

np.dot(t1, t2) 错误是因为矩阵乘法错误:

ValueError:形状 (2,) 和 (4,2) 未对齐:2 (dim 0) != 4 (dim 0)

这是对的。我能理解。但是为什么 np.dot(t2, t1) 有输出而不是 np.dot(t1, t2) 的错误呢?参数的不同顺序有不同的解释。

[7 7 7 7]

谢谢。

【问题讨论】:

    标签: numpy


    【解决方案1】:

    请参考documentation:

    函数引发 ValueError:

    如果a的最后一个维度与b的倒数第二个维度的大小不同。

    请注意,您不仅使用一维数组:

    In [6]: t1.ndim
    Out[6]: 1
    
    In [7]: t2.ndim
    Out[7]: 2
    

    所以,t2 是一个二维数组。 您还可以在t2.shape 的输出中看到这一点:(4,2) 表示二维,因为 (2,) 是一维。

    np.dot 的行为对于 1D 和 2D 数组是不同的(来自 docs):

    对于二维数组,它等价于矩阵乘法,对于一维数组 数组到向量的内积

    这就是您得到不同结果的原因,因为您混合了 1D 和 2D 数组。由于t2 是一个二维数组,np.dot(b, a) 尝试矩阵乘法,np.dot(a, b) 尝试内积,但失败了。

    在矩阵乘法的情况下(参考docs):第二个参数是一维的,它通过在其维度上附加一个 1 来提升为矩阵。在矩阵乘法之后,附加的 1 被删除。简单来说,t2 形状为 (4,2),t1 形状为 (2,)。 t1 是一维的,t1 的形状被转换为 (2,1) 并且在矩阵乘法之后 1 被删除。因此,如果您要存储点积的输出,您可以检查形状是否为 (4, )。

    t = np.dot(t2,t1)
    t.shape
    
    t.shape
    Out[57]: (4,)
    

    【讨论】:

    • 你似乎不明白我的问题。为什么不同的参数顺序会有不同的解释?
    • 根据定义,矩阵乘法不可交换。
    • 谢谢@Sayali Sonawane。 np.dot(t1, t2) 是一维数组乘以二维数组。这是矩阵乘法失败。这是对的; np.dot(t2, t1) 是二维数组 (4*2) 与一维数组 (1*2) 的乘积。这不会失败。为什么?
    • 如果一维数组与二维数组相乘,一维数组会一直被numpy自动当作列向量处理?
    • 在矩阵乘法的情况下:第二个参数是一维的,它通过在其维度上附加一个 1 来提升为矩阵。在矩阵乘法之后,附加的 1 被删除。简单来说,t2 形状为 (4,2),t1 形状为 (2,)。 t1 是一维的,t1 的形状被转换为 (2,1) 并且在矩阵乘法之后 1 被删除。因此,如果您要存储点积的输出,您可以检查形状是否为 (4, )。
    猜你喜欢
    • 2016-01-05
    • 1970-01-01
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 2015-03-17
    • 2013-03-20
    • 1970-01-01
    • 2014-03-29
    相关资源
    最近更新 更多