考虑以下 3 个数组:
np.random.seed(0)
X = np.random.randint(10, size=(4,5))
W = np.random.randint(10, size=(3,4))
y = np.random.randint(3, size=(5,1))
我想将矩阵 X 的每一列添加和求和到 W 的行,由 y 作为索引给出。因此,例如,如果 y 中的第一个元素是 3 ,我会将 X 的第一列添加到 W 的第四行(python 中的索引 3)并求和。我会一遍又一遍地做,直到 X 的所有列都添加到 W 的特定行并求和。我可以用不同的方式做到这一点:1-使用for循环:
for i,j in enumerate(y):
W[j]+=X[:,i]
2-使用 add.at 功能
np.add.at(W,(y.ravel()),X.T)
3-但我不明白如何使用 einsum 来做到这一点。我得到了一个解决方案,但真的无法理解。
N = y.max()+1
W[:N] += np.einsum('ijk,lk->il',(np.arange(N)[:,None,None] == y.ravel()),X)
任何人都可以解释我这个结构吗?1 - (np.arange(N)[:,None,None] == y.ravel(),X)。我想这部分是指根据 y 将 X 的列与 W 的特定行相加。但是 W 在哪里?在这种情况下,为什么我们必须将 W 转换为 4 维?2- 'ijk,lk->il' - 我也不明白这一点。
i - 指行,j - 列,k- 每个元素,l - 'l' 也指什么?如果有人能理解这一点并向我解释,我将不胜感激。提前致谢。