【发布时间】:2021-03-02 03:29:14
【问题描述】:
我目前正在研究用 einsum 函数计算 numpy 中的四阶张量。
我正在计算的张量是用爱因斯坦符号编写的,函数 einsun 完美地完成了工作!但我想知道在以下情况下它在做什么:
import numpy as np
a=np.array([[2,0,3],[0,1,0],[0, 0, 4]])
b= np.eye(3)
r1=np.einsum("ij,kl->ijkl", a, b)
r2=np.einsum("ik,jl->ijkl", a, b)
在r1我基本上是在做标准张量积(相当于np.tensordot(a,b,axes=0))。
r2 呢?
我知道我可以通过a[:,None,:,None]*b[None,:,None,:] 获得价值,但我不知道索引在做什么。这个操作有名字吗?
对不起,如果这太简单了!
【问题讨论】:
-
我认为
r1和r2都是外部产品。第二个只是重新排序 4d 结果的轴。矩阵乘积可以进行相同类型的乘法运算,但它对一个或多个轴求和(共享索引)。在您的情况下,没有产品的总和。r1也可以用广播编写 - 只需重新排序None。 -
np.tensordot对输入进行整形和转置,直到它可以执行标准的 2ddot乘积,然后将结果转换回来。我的记忆是单个数字轴参数被转换为扩展的轴元组。我发现einsum索引更清晰,更强大。 -
关于索引在做什么的问题,你的意思不是很清楚,但听起来你在问
None在做什么。它正在创建一个大小为 1 的额外维度,以便数组兼容乘法。这叫做广播。 -
r2 只是 r1 的轴置换版本
标签: numpy numpy-ndarray numpy-einsum