code: def test_AddFeatsByKeys(self):
      N = 10
      mapping = {"a": 1, "b": 2, "c": 3, "d": 4}
      keys, values = np.asarray(list(mapping.keys())), np.asarray(
          list(mapping.values())
      )
      data = Data(
          a=torch.randn((N, 1)),
          b=torch.randn((N, 2)),
          c=torch.randn((N, 3)),
          d=torch.randn((N, 4)),
          pos=torch.randn((N)),
      )
      mask = np.random.uniform(0, 1, (4)) > 0.1
      transform = AddFeatsByKeys(mask, keys)
      data_out = transform(data)
      self.assertEqual(data_out.x.shape[-1], np.sum(values[mask]))
  
imports: import unittest
  import sys
  import os
  import torch_geometric.transforms
  import numpy
  import numpy.testing
  import torch
  from torch_geometric.data import Data
  from omegaconf.dictconfig import DictConfig
  from omegaconf.listconfig import ListConfig
  from omegaconf import OmegaConf
  from torch_points3d.core.data_transform import instantiate_transform, instantiate_transforms, GridSampling3D, MultiScaleTransform, Random3AxisRotation, AddFeatByKey, AddFeatsByKeys, RemoveAttributes, RandomDropout, ShiftVoxels, PCACompute, RandomCoordsFlip, XYZFeature, ScalePos, RandomWalkDropout, NormalizeFeature, SphereCrop, CubeCrop, RandomSphereDropout, DensityFilter, LotteryTransform, ClampBatchSize, RandomParamTransform, Select, ComposeTransform
  from torch_points3d.core.spatial_ops import RadiusNeighbourFinder, KNNInterpolate
  from torch_points3d.utils.enums import ConvolutionFormat
  from torch_points3d.datasets.multiscale_data import MultiScaleBatch
label_desc: Use image node_id 5 for calling the Testhelpers obj's underlying member method code with example usage: obj.test_AddFeatsByKeys() without return types