# 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.