用numpy einsum计算外积

2024-04-19 17:40:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图深入研究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在没有匹配轴标签的情况下如何工作


Tags: theanswerby规则np符号标签array
2条回答

np.einsum('i,j->ij', x, y)的输出中,元素[i,j]只是x中的元素iy中的元素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]

np.einsum('i,i->i', x, y)

[ 4 10 18]

如果输入中的标签在输出中丢失,则表示输出已计算了沿丢失标签轴的和。下面是一个简单的例子:

np.einsum('i,j->i', x, y)

[15 30 45]

此处,输入中的标签j在输出中丢失,这相当于沿axis=1求和(对应于标签j):

np.sum(np.einsum('i,j->ij', x, y), axis=1)

[15 30 45]

通常,您可以通过准确了解输入和输出的尺寸或形状来理解einsum。einsum表示法是预期的和正在计算的

为了便于解释,假设x.shape=[3],y.shape=[4]

x = np.array([1, 2, 3])
y = np.array([4, 5, 6, 7])
np.einsum('i,j->ij', x, y)
array([[ 4,  5,  6,  7],
       [ 8, 10, 12, 14],
       [12, 15, 18, 21]])

维度

对于叉积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正在讨论如何在ij列的位置计算一个元素。元素必须根据输入的乘积进行计算。这里意味着位置[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{}中的ij是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

因此,结果是

np.einsum('i,j->ji', x, y)
array([[ 4,  8, 12],
       [ 5, 10, 15],
       [ 6, 12, 18],
       [ 7, 14, 21]])

相关问题 更多 >