docs: def train(self, data=None, epochs=10, radius0=0, radiusN=1,
                radiuscooling="linear",
                scale0=0.1, scaleN=0.01, scalecooling="linear"):
          """Train the map on the current data in the Somoclu object.
          :param data: Optional parameter to provide training data. It is not
                       necessary if the data was added via the method
                       `update_data`.
          :type data: 2D numpy.array of float32.
          :param epochs: The number of epochs to train the map for.
          :type epochs: int.
          :param radius0: The initial radius on the map where the update happens
                          around a best matching unit. Default value of 0 will
                          trigger a value of min(n_columns, n_rows)/2.
          :type radius0: float.
          :param radiusN: The radius on the map where the update happens around a
                          best matching unit in the final epoch. Default: 1.
          :type radiusN: float.
          :param radiuscooling: The cooling strategy between radius0 and radiusN:
  
                                     * "linear": Linear interpolation (default)
                                     * "exponential": Exponential decay
          :param scale0: The initial learning scale. Default value: 0.1.
          :type scale0: float.
          :param scaleN: The learning scale in the final epoch. Default: 0.01.
          :type scaleN: float.
          :param scalecooling: The cooling strategy between scale0 and scaleN:
  
                                     * "linear": Linear interpolation (default)
                                     * "exponential": Exponential decay
          :type scalecooling: str.
          """
          _check_cooling_parameters(radiuscooling, scalecooling)
          if self._data is None and data is None:
              raise Exception("No data was provided!")
          elif data is not None:
              self.update_data(data)
          self._init_codebook()
          self.umatrix.shape = (self._n_rows * self._n_columns, )
          self.bmus.shape = (self.n_vectors * 2, )
          wrap_train(np.ravel(self._data), epochs, self._n_columns, self._n_rows,
                     self.n_dim, self.n_vectors, radius0, radiusN,
                     radiuscooling, scale0, scaleN, scalecooling,
                     self._kernel_type, self._map_type, self._grid_type,
                     self._compact_support, self._neighborhood == "gaussian",
                     self._std_coeff, self._verbose, self.codebook, self.bmus,
                     self.umatrix)
          self.umatrix.shape = (self._n_rows, self._n_columns)
          self.bmus.shape = (self.n_vectors, 2)
          self.codebook.shape = (self._n_rows, self._n_columns, self.n_dim)