# One Max Problem: Using NumpyΒΆ

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.