class_docstr: Shears node positions by randomly sampled factors :math:`s` within a
  given interval, *e.g.*, resulting in the transformation matrix
  (functional name: :obj:`random_shear`).
  
  .. math::
      \begin{bmatrix}
          1      & s_{xy} & s_{xz} \\
          s_{yx} & 1      & s_{yz} \\
          s_{zx} & z_{zy} & 1      \\
      \end{bmatrix}
  
  for three-dimensional positions.
  
  Args:
      shear (float or int): maximum shearing factor defining the range
          :math:`(-\mathrm{shear}, +\mathrm{shear})` to sample from.
code: def forward(self, data: Data) -> Data:
      assert data.pos is not None
  
      dim = data.pos.size(-1)
  
      matrix = data.pos.new_empty(dim, dim).uniform_(
          -self.shear, self.shear
      )
      eye = torch.arange(dim, dtype=torch.long)
      matrix[eye, eye] = 1
  
      return LinearTransformation(matrix)(data)
  
file_path: pytorch_geometric/torch_geometric/transforms/random_shear.py
imports: from typing import Union
  import torch
  from torch_geometric.data import Data
  from torch_geometric.data.datapipes import functional_transform
  from torch_geometric.transforms import BaseTransform, LinearTransformation
label_desc: Use image node_id 2 for calling the RandomShear obj's underlying member method code with example usage: obj.forward(data) and returns: LinearTransformation