Sadly, that doesn't work; if `obj` is a view of part of another array, that array will not get updated:
```
import numpy as np
class myarray(np.ndarray):
    pass

a = np.arange(10.).view(myarray)
b = a[:5]
b += 10.
c = b.copy()
b._result = c
b.data = b._result.data
b += 1000.
b, a
```
yields
```
(myarray([ 1010.,  1011.,  1012.,  1013.,  1014.]),
 myarray([ 10.,  11.,  12.,  13.,  14.,   5.,   6.,   7.,   8.,   9.]))
```

I think the only way out would be to let the copy in `__array_prepare__` depend on whether or not data is contiguous, i.e., keeping the original behaviour if it is (to avoid confusion, one could use a different attribute for the two cases).