The numpy version one max genetic algorithm example is very similar to one max
short example. The individual class is inherited from the `numpy.ndarray`.

```
import numpy
creator.create("Individual", numpy.ndarray, fitness=creator.FitnessMax)
```

The first major difference is the crossover function that implements
the copying mechanism mentionned in the *Inheriting from Numpy* tutorial.

```
def cxTwoPointCopy(ind1, ind2):
"""Execute a two points crossover with copy on the input individuals. The
copy is required because the slicing in numpy returns a view of the data,
which leads to a self overwritting in the swap operation. It prevents
::
>>> import numpy
>>> a = numpy.array((1,2,3,4))
>>> b = numpy.array((5.6.7.8))
>>> a[1:3], b[1:3] = b[1:3], a[1:3]
>>> print(a)
[1 6 7 4]
>>> print(b)
[5 6 7 8]
"""
size = len(ind1)
cxpoint1 = random.randint(1, size)
cxpoint2 = random.randint(1, size - 1)
if cxpoint2 >= cxpoint1:
cxpoint2 += 1
else: # Swap the two cx points
cxpoint1, cxpoint2 = cxpoint2, cxpoint1
ind1[cxpoint1:cxpoint2], ind2[cxpoint1:cxpoint2] \
= ind2[cxpoint1:cxpoint2].copy(), ind1[cxpoint1:cxpoint2].copy()
return ind1, ind2
```

This crossover function is added to the toolbox instead of the original
`deap.tools.cxTwoPoint()` crossover.

```
toolbox.register("mate", cxTwoPointCopy)
```

The second major difference is the use of the *similar* function in the
`HallOfFame` that has to be set to a `numpy.array_equal()`
or `numpy.allclose()`

```
hof = tools.HallOfFame(1, similar=numpy.array_equal)
```

The complete source code: examples/ga/onemax_numpy.