Python 从numpy到Pytorch的矩阵乘法(元素级)

Python 从numpy到Pytorch的矩阵乘法(元素级),python,pytorch,matrix-multiplication,Python,Pytorch,Matrix Multiplication,我得到了两个numpy阵列(图像和环境地图) 两种形状都(256、512、3) 当我用numpy进行乘法(元素)时: prod = np.multiply(MatA,MatB) 我得到了想要的结果(返回图像时通过枕头进行可视化) 但是,当我使用Pytork进行操作时,我得到了一个非常奇怪的结果(甚至与前面提到的结果不太接近) 我使用了以下代码: MatATensor = transforms.ToTensor()(MatA) MatBTensor = transforms.ToTensor()

我得到了两个numpy阵列(图像和环境地图)

两种形状都
(256、512、3)

当我用numpy进行乘法(元素)时:

prod = np.multiply(MatA,MatB)
我得到了想要的结果(返回图像时通过枕头进行可视化)

但是,当我使用Pytork进行操作时,我得到了一个非常奇怪的结果(甚至与前面提到的结果不太接近)

我使用了以下代码:

MatATensor = transforms.ToTensor()(MatA)
MatBTensor = transforms.ToTensor()(MatB)

prodTensor = MatATensor * MatBTensor
由于某些原因,MataSensor和MatbSensor的形状都是

torch.Size([3, 256, 512])
前张量也一样。 当我尝试将形状改为
(256512,3)
时,出现了一个错误

有没有办法得到同样的结果


我是pytorch的新手,如果您阅读了pytorch的文档,您将看到此转换不仅将numpy数组转换为
torch.FloatTensor
,而且还将其维度从
H
x
W
x
3
转换为
3
x
H
x
W
要“撤消”此操作,您需要

 prodasNp = (prodTensor.permute(2, 0, 1) * 255).to(torch.uint8).numpy()
有关更多信息,请参阅。

我建议您使用,它可以轻松地将
ndarray
s转换为火炬张量。例如:

In[1]: MatA = np.random.rand(256, 512, 3)
In[2]: MatB = np.random.rand(256, 512, 3)

In[3]: MatA_torch = torch.from_numpy(MatA)
In[4]: MatB_torch = torch.from_numpy(MatB)

In[5]: mul_np = np.multiply(MatA, MatB)
In[6]: mul_torch = MatA_torch * MatB_torch

In[7]: torch.equal(torch.from_numpy(mul_np), mul_torch)
Out[7]: True

In[8]: mul_torch.shape
Out[8]: torch.Size([256, 512, 3])
如果你想把它还给numpy,只需执行以下操作:

mul_torch.numpy()

谢谢@Shai的回答。我最终通过在2d中重塑矩阵(w*h,3)来解决这个问题。我会确认你的解决方案soon@alphjheon请注意,
permute
view
之间有一个根本的区别:虽然
view
改变了张量的形状,但并不影响元素的实际排列。相反,
permute
对张量元素重新排序。有关更多详细信息,请参阅。
mul_torch.numpy()