我正试图深入研究einsum符号。这对我帮助很大
但现在我在计算外积时无法掌握einsum
的机制:
x = np.array([1, 2, 3])
y = np.array([4, 5, 6])
np.einsum('i,j->ij', x, y)
array([[ 4., 5., 6.],
[ 8., 10., 12.],
[12., 15., 18.]])
该answer给出了以下规则:
By repeating the label i in both input arrays, we are telling einsum that these two axes should be multiplied together.
如果我们没有在np.einsum('i,j->ij', x, y)
中提供任何重复的轴标签,我无法理解这个乘法是如何发生的
你能给出在这个例子中np.einsum
采取的步骤吗
或者更广泛的问题是einsum
在没有匹配轴标签的情况下如何工作
在
np.einsum('i,j->ij', x, y)
的输出中,元素[i,j]
只是x
中的元素i
和y
中的元素j
的乘积。换句话说,np.einsum('i,j->ij', x, y)[i,j] = x[i]*y[j]
将其与输出的
np.einsum('i,i->i', x, y)
WARE元素i
进行比较x[i]*y[i]
:如果输入中的标签在输出中丢失,则表示输出已计算了沿丢失标签轴的和。下面是一个简单的例子:
此处,输入中的标签
j
在输出中丢失,这相当于沿axis=1
求和(对应于标签j
):通常,您可以通过准确了解输入和输出的尺寸或形状来理解einsum。einsum表示法是预期的和正在计算的
为了便于解释,假设x.shape=[3],y.shape=[4]
维度
对于叉积
np.einsum('i,j->ij', x, y)
,第一个输入是单个字符i
。您可以认为字符数就是该输入的维度数。所以这里第一个输入x
只有一个维度。与j相同,第二个输入也是一个字符j
,因此它只有一个维度。最后,输出ij
有2个字符,因此它有2个维度,该维度必须是[3,4]
,因为第一个输入中的元素数是i
,有3个元素,第二个输入中的元素数是j
,有4个元素结果数组中的每个元素
然后,您将关注结果表示法
ij
。现在我们知道它是一个2D数组,或者是一个3乘4的矩阵,ij
正在讨论如何在i
行j
列的位置计算一个元素。元素必须根据输入的乘积进行计算。这里意味着位置[i,j]上的特定元素是其位置i
的输入a和其位置j
的输入b的乘积因此,位置[0,0]上的元素是通过取第一个输入位置0(即x[0]=1)和第二个输入位置[0](即y[0]=4)计算得出的,这是一个元素[0,0]=1*4=4的结果
同样,结果位置[2,3]上的元素取x[2]和y[3]=3*7=21
简言之,认为}中的
ij
{i
次j
是2维结果的一个元素(因为2个字符)。从inputi
和inputj
获取的实际元素是根据ij
的位置索引获取的您可以在一行中找到外部产品的转置
也就是说,外积的转置就是
i,j->ji
。这里,结果中有两个字符,因此它是一个2D数组。第一维度的元素数必须是j
大小,因为它位于第一位。第二个输入有4个元素。第二维度的逻辑相同,因此我们知道结果数组的形状为(4,3)然后,结果2D数组的[3,2]位置的一个元素是
ji
,意思是输入j
乘以输入i
,因此它是j
=y[3]=7的元素3,以及i
=x[2]=3的元素2。结果是7*3=21因此,结果是
相关问题 更多 >
编程相关推荐