Note these two loops can be combined.
I.E.
```
        for (index, dim, src_min, src_max, modulus) in self._circulars:
            # Map all the requested values into the range of the source
            # data (centred over the centre of the source data to allow
            # extrapolation where required).
            offset = (src_max + src_min - modulus) * 0.5
            points[:, index] = wrap_circular_points(points[:, index],
                                                    modulus, offset)
            # Extend the data array to match.
            data = _extend_circular_data(data, dim)
```