maxframe.tensor.matmul#
- maxframe.tensor.matmul(a, b, sparse=None, out=None, **kw)[源代码]#
两个张量的矩阵乘积。
其行为取决于参数,具体如下。
如果两个参数都是二维的,则按照常规矩阵方式相乘。
如果任一参数是 N 维(N > 2),则将其视为驻留在最后两个索引中的矩阵堆栈,并据此进行广播。
如果第一个参数是一维的,则通过在其维度前添加一个 1 将其提升为矩阵。矩阵乘法后,添加的 1 会被移除。
如果第二个参数是一维的,则通过在其维度后添加一个 1 将其提升为矩阵。矩阵乘法后,添加的 1 会被移除。
不允许与标量相乘,请改用
*。注意,将矩阵堆栈与向量相乘会得到向量堆栈,但 matmul 不会将其识别为向量堆栈。matmul与dot在两个重要方面有所不同。不允许与标量相乘。
矩阵堆栈将像元素一样进行广播。
- 参数:
a (array_like) -- 第一个参数。
b (array_like) -- 第二个参数。
out (Tensor, optional) -- 输出参数。它必须具有未使用时将返回的确切类型。特别是,它必须具有正确的类型,且其 dtype 必须是 dot(a,b) 将返回的 dtype。这是一个性能特性。因此,如果这些条件未满足,将引发异常,而不是尝试灵活处理。
- 返回:
output -- 返回 a 和 b 的点积。如果 a 和 b 都是一维数组,则返回一个标量;否则返回一个数组。如果提供了 out,则返回 out。
- 返回类型:
Tensor
- 抛出:
ValueError -- 如果 a 的最后一维与 b 的倒数第二维大小不同。如果传入了标量值。
备注
matmul 函数实现了在 Python 3.5 中根据 PEP465 引入的 @ 运算符的语义。
示例
对于二维数组,它是矩阵乘积:
>>> import maxframe.tensor as mt
>>> a = [[1, 0], [0, 1]] >>> b = [[4, 1], [2, 2]] >>> mt.matmul(a, b).execute() array([[4, 1], [2, 2]])
对于二维与一维混合,结果是常规的。
>>> a = [[1, 0], [0, 1]] >>> b = [1, 2] >>> mt.matmul(a, b).execute() array([1, 2]) >>> mt.matmul(b, a).execute() array([1, 2])
广播对于数组堆栈是常规的
>>> a = mt.arange(2*2*4).reshape((2,2,4)) >>> b = mt.arange(2*2*4).reshape((2,4,2)) >>> mt.matmul(a,b).shape (2, 2, 2) >>> mt.matmul(a,b)[0,1,1].execute() 98 >>> mt.sum(a[0,1,:] * b[0,:,1]).execute() 98
向量,向量返回标量内积,但两个参数都不进行复共轭:
>>> mt.matmul([2j, 3j], [2j, 3j]).execute() (-13+0j)
标量乘法会引发错误。
>>> mt.matmul([1,2], 3) Traceback (most recent call last): ... ValueError: Scalar operands are not allowed, use '*' instead