def _transform_value(self):
        """Mangle the value into a numpy array. This does several things:

        - If it is stringlike (bytes or unicode) and the expected shape is
          1D, it is split into an array of characters.
        - It is coerced to a numpy array, enforcing the dtype and order. Where
          possible, no copy is made.
        - The shape is checked against the expected shape.

        Returns
        -------
        value : :py:class:`numpy.ndarray`
            The transformed value

        Raises
        ------
        ValueError
            if the value is `None`
        ValueError
            if the value has the wrong shape
        TypeError
            if numpy raised it when trying to convert the value
        """
        value = self.value
        if value is None:
            raise ValueError('Cannot send a value of None')
        if (isinstance(value, (six.binary_type, six.text_type)) and
                len(self.shape) == 1):
            # This is complicated by Python 3 not providing a simple way to
            # turn a bytes object into a list of one-byte objects, the way
            # list(str) does.
            value = [self.value[i : i + 1] for i in range(len(self.value))]
        value = _np.array(value, dtype=self._internal_dtype, order=self.order, copy=False)
        if not self.compatible_shape(value.shape):
            raise ValueError('Value has shape {}, expected {}'.format(value.shape, self.shape))
        return value