【发布时间】:2018-10-05 20:06:10
【问题描述】:
考虑下面的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' 也指什么? 如果有人能理解这一点并向我解释,我将不胜感激。 提前致谢。
【问题讨论】:
标签: python linear-algebra numpy-einsum