Python Pytorch和numpy广播规则的差异?

Python Pytorch和numpy广播规则的差异?,python,numpy,pytorch,Python,Numpy,Pytorch,我用torch做了一些实验,以下是我的发现: (5,7,3)和(5,7,3)->(5,7,3)-相等 (5,3,4,1)和(5,3,1,1)->(5,3,4,1)-一个dim为1 (5,3,4,1)和(3,4,1)->(5,3,4,1)-一个dim不存在 (5,3,4,1)和(3,1,1)->(5,3,4,1)-一个dim为1,一个不存在 (4,3,2)和(5,4,1,1)->(5,4,3,2) (4,1)和(5,3,1,1)->(5,3,4,1)-一个dim为1,两个dim不存在 (1)和(

我用torch做了一些实验,以下是我的发现:

  • (5,7,3)和(5,7,3)->(5,7,3)
    -相等
  • (5,3,4,1)和(5,3,1,1)->(5,3,4,1)
    -一个dim为1
  • (5,3,4,1)和(3,4,1)->(5,3,4,1)
    -一个dim不存在
  • (5,3,4,1)和(3,1,1)->(5,3,4,1)
    -一个dim为1,一个不存在
  • (4,3,2)和(5,4,1,1)->(5,4,3,2)
  • (4,1)和(5,3,1,1)->(5,3,4,1)
    -一个dim为1,两个dim不存在
  • (1)和(5,3,4,2)->(5,3,4,2)
    -一个dim为1,其他dim不存在
  • ()和(5,3,4,2)->(5,3,4,2)
    -标量和张量
  • (0)和(5,3,2,1)->(5,3,2,0)
    -空张量和张量
  • (4,1)和(4)->(4,4)
    -缺少的dim为1
  • (4,2)和(4)
    ->不可广播
  • (5,2,1)和(5,3,2,1)
    ->不可广播
  • (5,3,2,1)和(5,3,2)
    ->不可广播
Pytorch文档说明:

许多PyTorch操作支持NumPy广播语义

这是否意味着pytorch遵循numpy的广播规则,它们是相同的,还是我也应该尝试numpy

numpy的文档中没有列出pytourch的特定规则。甚至pytorch的文档也不是完全准确的,例如,它说每个张量应该至少有一个维度,但是
torch.empty(3,4)+torch.tensor(42)
工作得很好(scalar没有维度)

我发现的规则是:

  • 从尾部尺寸开始,尺寸标注必须相等,或者其中一个尺寸标注应为1(对于缺少的第一个尺寸标注,假定为1)
  • 对于每个dim,生成的dim是两个dim中的最大值
  • 在位操作不允许在位张量改变形状
这似乎是最合理的广播方式,我不明白为什么numpy会有不同。但也许有一些特点


如果有人能提供证据,或者至少能证明numpy与pytorch有相同的规则,那么我将不胜感激,因为我不必研究numpy的广播行为。

看起来“标量张量”案例中有一个拼写错误。所有的例子都是我所期望的
numpy
。我认为有两条规则:1)添加前导1以匹配维度数,2)缩放所有1以匹配。@hpaulj谢谢。你的2条规则比文档中的规则更简单,当然也更全面。你的意思是在文档中还是在我的示例中(
torch.tensor(42).size()
is
torch.size([])
)?
()和(5,3,4,2)->(5,3,4,2)-标量和张量