1

我有两个矩阵,5x4 和 3x2。我想从他们那里得到一个 5x3 矩阵。

>>>theta_ic = np.random.randint(5,size=(5,4))
>>>psi_tr  = np.random.randint(5,size=(3,2))

我可以这样做

>>>np.einsum('ij,kl->ik',theta_ic,psi_tr).shape
(5,3)

但我不知道如何通过 numpy.tensordot 做到这一点我试过这个

>>>np.tensordot(theta_ic,psi_tr,((1),(1)))

我收到一个错误

ValueError: shape-mismatch for sum

背后的数学是

z_ij = \sum_{c=1}^4{x_{ic}}\sum_{d=1}^{2}{y_{jd}}
where i=[1,...,5], j=[1...3]

为什么我需要迁移einsumtensordot?

因为我正在使用作为后端加速计算的pymc3包进行研究。theano

但是,theano.tensor不支持einsum,它只支持tensordot,与 . 相同的语法np.tensordot

4

1 回答 1

0

你的 einsum 公式的事实

'ij,kl->ik'

使用索引j,并且l一次意味着您可以在操作之前对它们进行求和。

theta_ic2 = np.sum(theta_ic, axis=1)
psi_tr2 = np.sum(psi_tr, axis=1)

你最终得到

'i,k->ik'

这只是外部产品

theta_ic2[:, None] * psi_tr2

或在一行中

np.sum(theta_ic, axis=1)[:, None] * np.sum(psi_tr, axis=1)

在 中np.tensordot,设置axes=0将产生外积:

np.tensordot(np.sum(theta_ic, axis=1), np.sum(psi_tr, axis=1), axes=0)
于 2021-10-21T17:22:49.733 回答