【问题标题】:numpy.dot how to calculate 1-D array with 2-D arraynumpy.dot 如何用二维数组计算一维数组
【发布时间】:2013-11-21 12:56:11
【问题描述】:

numpy.dot 文档字符串说:

对于二维数组,它相当于矩阵乘法,对于一维数组,它相当于向量的内积(没有复共轭)。对于 N 维,它是 a 的最后一个轴和 b 的倒数第二个轴的和积

但它并没有说明numpy.dot如何用二维数组计算一维数组。那么Numpy如何处理一维数组(向量)和二维数组(矩阵)?

我做了一些测试:

In [27]: a
Out[27]: 
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

In [28]: b
Out[28]: array([0, 1, 2])

In [29]: np.dot(a,b)
Out[29]: array([ 5, 14, 23])

In [30]: np.dot(a, b.reshape(-1,1))
Out[30]: 
array([[ 5],
       [14],
       [23]])

In [31]: np.dot(a, b.reshape(-1,1)).ravel() # same as np.dot(a,b)
Out[31]: array([ 5, 14, 23])

In [32]: np.dot(b,a)
Out[32]: array([15, 18, 21])

In [33]: np.dot(b.reshape(1,-1), a)
Out[33]: array([[15, 18, 21]])

In [34]: np.dot(b.reshape(1,-1), a).ravel() # same as np.dot(b,a)
Out[34]: array([15, 18, 21])

上述测试表明 numpy.dot 可以处理一维数组和二维数组。这样对吗?

【问题讨论】:

    标签: python numpy linear-algebra


    【解决方案1】:

    一维数组和二维数组作为矩阵向量(或向量矩阵)乘积处理。该实现实际上使用 BLAS *gemv 函数来处理浮点输入的这种情况。

    【讨论】:

    • 感谢您对 Fortran BLAS 的解释!
    • @Honghe.Wu 其实调用的是CBLAS。
    • @larsmans:这实际上取决于 numpy 的编译方式。通常,您更喜欢 Intel MKL 链接的 numpy,它在 Windows 上很容易获得,如果您不进行商业开发,可以为各种 Linux 发行版获取。
    • @rubenvb:是的,如果你链接到另一个 CBLAS 实现,它会调用它。我指的是 API,而不是它的任何特定实现。
    【解决方案2】:

    只有一种情况没有在文档中明确描述,但有点暗示,即如何将规则应用于 2D 和 1D 输入:

    它是a的最后一个轴和倒数第二个轴的和积 b

    在您的情况下,当您执行np.dot(a, b) 时,b 没有“倒数第二个”轴。那么 numpy 所做的就是解决最后一个问题。因此,正如您的测试很容易显示的那样,它会计算 a 的每一行与 b 的总和。

    您的所有其他示例都符合上述规则。

    【讨论】:

      猜你喜欢
      • 2018-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-28
      • 1970-01-01
      相关资源
      最近更新 更多