mindspore.mint.einsum
- mindspore.mint.einsum(equation, *operands)[源代码]
基于爱因斯坦求和约定(Einsum)符号,沿着指定维度对输入Tensor元素的乘积求和。你可以使用这个运算符来执行对角线、减法、转置、矩阵乘法、乘法、内积运算等等。
说明
现在支持子列表模式。例如,mint.einsum(op1, sublist1, op2, sublist2, …, sublist_out)。在子列表模式中, equation 由子列表推导得到,Python的省略号和介于[0, 52)的整数list组成子列表。每个操作数后面都有一个子列表,并且最后有一个表示输出的子列表。 动态shape、动态rank的输入不支持在 图模式(mode=mindspore.GRAPH_MODE) 下执行。
警告
这是一个实验性API,后续可能修改或删除。
- 参数:
equation (str) - 基于爱因斯坦求和约定的符号,表示想要执行的操作。符号只能包含字母(必须在 [a-zA-Z] 中)、逗号、省略号和箭头。字母表示输入Tensor维数,逗号表示单独的Tensor,省略号表示忽略的Tensor维数,箭头的左边表示输入Tensor,右边表示期望输出的维度。如果方程中没有箭头,则方程中仅出现一次的字母将代表一部分的输出的维度,并按字母顺序升序排序。此时输出是通过先将输入操作数维度根据字母对齐后按元素相乘,然后将不属于输出字母对应的维度进行相加。如果方程中有一个箭头,则代表输出的字母必须在输入字母中出现至少一次,而在输出字母中只能最多出现一次。
operands (Tensor) - 用于计算的输入Tensor。Tensor的数据类型必须相同。
- 返回:
Tensor,shape可以根据 equation 得到。数据类型和输入Tensor相同。
- 异常:
TypeError - equation 无效或者不匹配输入Tensor。
ValueError - 子列表模式下子列表的数字不介于[0, 52)之间。
- 支持平台:
Ascend
样例:
>>> import mindspore >>> import numpy as np >>> from mindspore import Tensor, mint >>> x = Tensor(np.array([1.0, 2.0, 4.0]), mindspore.float32) >>> equation = "i->" >>> output = mint.einsum(equation, x) >>> print(output) [7.] >>> x = Tensor(np.array([1.0, 2.0, 4.0]), mindspore.float32) >>> y = Tensor(np.array([2.0, 4.0, 3.0]), mindspore.float32) >>> equation = "i,i->i" >>> output = mint.einsum(equation, x, y) >>> print(output) [ 2. 8. 12.] >>> x = Tensor(np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]), mindspore.float32) >>> y = Tensor(np.array([[2.0, 3.0], [1.0, 2.0], [4.0, 5.0]]), mindspore.float32) >>> equation = "ij,jk->ik" >>> output = mint.einsum(equation, x, y) >>> print(output) [[16. 22.] [37. 52.]] >>> x = Tensor(np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]), mindspore.float32) >>> equation = "ij->ji" >>> output = mint.einsum(equation, x) >>> print(output) [[1. 4.] [2. 5.] [3. 6.]] >>> x = Tensor(np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]), mindspore.float32) >>> equation = "ij->j" >>> output = mint.einsum(equation, x) >>> print(output) [5. 7. 9.] >>> x = Tensor(np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]), mindspore.float32) >>> equation = "...->" >>> output = mint.einsum(equation, x) >>> print(output) [21.] >>> x = Tensor(np.array([1.0, 2.0, 3.0]), mindspore.float32) >>> y = Tensor(np.array([2.0, 4.0, 1.0]), mindspore.float32) >>> equation = "j,i->ji" >>> output = mint.einsum(equation, x, y) >>> print(output) [[ 2. 4. 1.] [ 4. 8. 2.] [ 6. 12. 3.]] >>> x = mindspore.Tensor([1, 2, 3, 4], mindspore.float32) >>> y = mindspore.Tensor([1, 2], mindspore.float32) >>> output = mint.einsum(x, [..., 1], y, [..., 2], [..., 1, 2]) >>> print(output) [[1. 2.] [2. 4.] [3. 6.] [4. 8.]]