[Numpy-discussion] Add guaranteed no-copy to array creation and reshape?

Todd toddrjen at gmail.com
Thu Jan 10 02:35:25 EST 2019


On Wed, Dec 26, 2018, 18:29 Sebastian Berg <sebastian at sipsolutions.net
wrote:

> Hi all,
>
> In https://github.com/numpy/numpy/pull/11897 I am looking into the
> addition of a `copy=np.never_copy` argument to:
>   * np.array
>   * arr.reshape/np.reshape
>   * arr.astype
>
> Which would cause an error to be raised when numpy cannot guarantee
> that the returned array is a view of the input array.
> The motivation is to easier avoid accidental copies of large data, or
> ensure that in-place manipulation will be meaningful.
>
> The copy flag API would be:
>   * `copy=True` forces a copy
>   * `copy=False` allows numpy to copy if necessary
>   * `copy=np.never_copy` will error if a copy would be necessary
>   * (almost) all other input will be deprecated.
>
> Unfortunately using `copy="never"` is tricky, because currently
> `np.array(..., copy="never")` behaves exactly the same as
> `np.array(..., copy=bool("never"))`. So that the wrong result would be
> given on old numpy versions and it would be a behaviour change.
>
> Some things that are a not so nice maybe:
>  * adding/using `np.never_copy` is not very nice
>  * Scalars need a copy and so will not be allowed
>  * For rare array-likes numpy may not be able to guarantee no-copy,
>    although it could happen (but should not).
>
>
> The history is that a long while ago I considered adding a copy flag to
> `reshape` so that it is possible to do `copy=np.never_copy` (or
> similar) to ensure that no copy is made. In these, you may want
> something like an assertion:
>
> ```
> new_arr = arr.reshape(new_shape)
> assert np.may_share_memory(arr, new_arr)
>
> # Which is sometimes -- but should not be -- written as:
> arr.shape = new_shape  # unnecessary container modification
>
> # Or:
> view = np.array(arr, order="F")
> assert np.may_share_memory(arr, new_arr)
> ```
>
> but is more readable and will not cause an intermediate copy on error.
>
>
> So what do you think? Other variants would be to not expose this for
> `np.array` and probably limit `copy="never"` to the reshape method. Or
> just to not do it at all. Or to also accept "never" for `reshape`,
> although I think I would prefer to keep it in sync and wait for a few
> years to consider that.
>
> Best,
>
> Sebastian
>

Could this approach be used to deprecate `ravel` and let us just use
`flatten`?

>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20190110/92817e35/attachment.html>


More information about the NumPy-Discussion mailing list