code: def _concat_helper(self, dev):
      np1 = np.random.random([5, 6, 7, 8]).astype(np.float32)
      np2 = np.random.random([5, 6, 7, 1]).astype(np.float32)
      np3 = np.concatenate((np1, np2), axis=3)
  
      t1 = tensor.Tensor(device=dev, data=np1)
      t2 = tensor.Tensor(device=dev, data=np2)
  
      ctensors = singa_api.VecTensor()
      ctensors.append(t1.data)
      ctensors.append(t2.data)
  
      t3_ct = singa_api.ConcatOn(ctensors, 3)
  
      np.testing.assert_array_almost_equal(
          tensor.to_numpy(_cTensor_to_pyTensor(t3_ct)), np3
      )
  
imports: from __future__ import division
  import unittest
  import math
  import numpy
  from singa import singa_wrap
  from singa import tensor
  from cuda_helper import gpu_dev, cpu_dev
label_desc: Use image node_id 20 for calling the TestAPI obj's underlying member method code with example usage: obj._concat_helper(dev) without return types