code: def voronoi(self, donor: np.ndarray, individual: np.ndarray) -> None:
      shape = self.shape
      if shape is None or len(shape) < 2:
          warnings.warn("Voronoi DE needs a shape.")
          self.twopoints(donor, individual)
          return
      local_donor = donor.reshape(shape)
      local_individual = individual.reshape(shape)
      x1 = np.array(
          [np.random.randint(shape[i]) for i in range(len(shape))]
      )
      x2 = np.array(
          [np.random.randint(shape[i]) for i in range(len(shape))]
      )
      x3 = np.array(
          [np.random.randint(shape[i]) for i in range(len(shape))]
      )
      x4 = np.array(
          [np.random.randint(shape[i]) for i in range(len(shape))]
      )
      it = np.nditer(local_donor, flags=["multi_index"])
      for _ in it:
          d1 = np.linalg.norm(np.array(it.multi_index) - x1)
          d2 = np.linalg.norm(np.array(it.multi_index) - x2)
          d3 = np.linalg.norm(np.array(it.multi_index) - x3)
          d4 = np.linalg.norm(np.array(it.multi_index) - x4)
          if min([d1, d2, d3]) > d4:
              local_donor[it.multi_index] = local_individual[
                  it.multi_index
              ]
      donor[:] = local_donor.flatten()[:]
      individual[:] = local_individual.flatten()[:]
  
imports: import warnings
  import numpy
  import nevergrad.common.typing
  from nevergrad.parametrization import parameter
  from .None import metamodel
  from .None import base
  from .None import oneshot
label_desc: Use image node_id 7 for calling the Crossover obj's underlying member method code with example usage: obj.voronoi(donor, individual) without return types