Numpy 如何矢量化以下python代码

Numpy 如何矢量化以下python代码,numpy,matrix,vectorization,matrix-multiplication,pytorch,Numpy,Matrix,Vectorization,Matrix Multiplication,Pytorch,我试图得到一个矩阵,其中每个元素的计算如下: X = torch.ones(batch_size, dim) X_ = torch.ones(batch_size, dim) Y = torch.ones(batch_size, dim) M = torch.zeros(batch_size, batch_size) for i in range(batch_size): for j in range(batch_size): M[i, j] = ((X[i] - X_[

我试图得到一个矩阵,其中每个元素的计算如下:

X = torch.ones(batch_size, dim)
X_ = torch.ones(batch_size, dim)
Y = torch.ones(batch_size, dim)
M = torch.zeros(batch_size, batch_size)
for i in range(batch_size):
    for j in range(batch_size):
        M[i, j] = ((X[i] - X_[i] * Y[j])**2).sum()
按元素计算
M
非常慢,关于如何使用矩阵乘法来代替for循环,有什么建议吗

谢谢。

如果您想
sum()
通过dim,您可以将2D问题“提升”到3D并在那里求和:

M = ((X[:, None, :] - X_[:, None, :] * Y[None, ...])**2).sum(dim=2)
它的工作原理

X[:,无,:]
X[:,无,:]
是三维尺寸的
(批量大小,1,尺寸)
,而
Y[无,…]
是三维尺寸的
(1,批量大小,尺寸)

将大小为1的尺寸乘以相应的尺寸,得到大小为
(批量大小,批量大小,dim)的结果。

最后,只对最后一个维度
(dim=2)
执行
sum()
,以获得大小
(批次大小,批次大小)
的输出
M


这里的诀窍是利用。

谢谢!因为M[i,j]是一个标量值感谢您对代码的解释,它完美地解决了我的问题。很抱歉造成混淆。我在这里传输代码时犯了一个错误。实际上X是一批向量,所以它的大小(batch_size,dim)。因此,应用sum()将得到一个标量。所以我想我们需要另一个版本的矢量化?