如何用pytorch做“逐个元素就地逆”?

s-m*_*m-e 3 python numpy python-3.x pytorch

给定一个数组a

a = np.arange(1, 11, dtype = 'float32')
Run Code Online (Sandbox Code Playgroud)

使用numpy,我可以执行以下操作:

np.divide(1.0, a, out = a)
Run Code Online (Sandbox Code Playgroud)

导致:

array([1.        , 0.5       , 0.33333334, 0.25      , 0.2       ,
       0.16666667, 0.14285715, 0.125     , 0.11111111, 0.1       ],
      dtype=float32)
Run Code Online (Sandbox Code Playgroud)

假设它a是pytorch张量,则以下操作失败

torch.div(1.0, a, out = a)
Run Code Online (Sandbox Code Playgroud)

的第一个参数div应为匹配长度/形状的张量。

如果我1.0b填充为1 的数组代替,则其长度等于的长度a,它可以工作。缺点是我必须为分配内存b。我也可以做类似的事情a = 1.0 / a,它将再次分配额外的(临时)内存。

如何理想地在广播中有效地“就地”执行此操作(无需分配额外的内存)?

小智 5

Pytorch遵循_就地操作使用的惯例。例如

add -> add_  # in-place equivalent
div -> div_  # in-place equivalent
etc
Run Code Online (Sandbox Code Playgroud)

逐个元素就位逆。

>>> a = torch.arange(1, 11, dtype=torch.float32) 
>>> a.pow_(-1) 
>>> a
>>> tensor([1.0000, 0.5000, 0.3333, 0.2500, 0.2000, 0.1667, 0.1429, 0.1250, 0.1111, 0.1000])
Run Code Online (Sandbox Code Playgroud)
>>> a = torch.arange(1, 11, dtype=torch.float32) 
>>> a.div_(a ** a) 
>>> a
>>> tensor([1.0000, 0.5000, 0.3333, 0.2500, 0.2000, 0.1667, 0.1429, 0.1250, 0.1111, 0.1000])
Run Code Online (Sandbox Code Playgroud)