numpy.dot如何计算1维数组和2维数组的乘积

5

numpy.dot的文档说明如下:

对于二维数组,它等价于矩阵乘法;对于一维数组,则是向量的内积(不进行复共轭)。对于N维数组,它是沿着a的最后一个轴和b的倒数第二个轴的乘积和。

但它没有阐述numpy.dot如何计算1-D数组与2-D数组。那么Numpy如何处理1-D数组(向量)和 2-D数组(矩阵)呢?

我做了一些测试:

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可以处理1-D数组与2-D数组。这是正确的吗?
2个回答

5
文档中未明确描述的一种情况是如何将规则应用于2D和1D输入:
"它是对a的最后一个轴和b的倒数第二个轴进行求积和求和."
在您的情况下,当您执行np.dot(a,b)时,没有b的“倒数第二”轴。 Numpy会选择最后一个轴。因此,它对a的每一行与b进行乘法运算并相加,这也可以从您的测试结果得出。
所有其他示例都符合以上规则。

5

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


感谢您对Fortran BLAS的解释! - Honghe.Wu
@Honghe.Wu 实际上是在调用CBLAS。 - Fred Foo
@larsmans:这实际上取决于numpy的编译方式。通常,您会选择链接Intel MKL的numpy,在Windows上很容易获取,并且如果您不是商业开发某些东西,则可以在各种Linux发行版上获得。 - rubenvb
@rubenvb:是的,如果你链接到另一个CBLAS实现,它会调用那个实现。我指的是API,而不是它的任何特定实现。 - Fred Foo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接