Contiguity of result of astype changed  intentional?
Hi,
We hit a subtle behavior change for the ``astype`` array method between 1.6.1 and 1.7.0 beta.
In 1.6.1:
In [18]: a = np.arange(24).reshape((2, 3, 4)).transpose((1, 2, 0))
In [19]: a.flags Out[19]: C_CONTIGUOUS : False F_CONTIGUOUS : False OWNDATA : False WRITEABLE : True ALIGNED : True UPDATEIFCOPY : False
In [20]: b = a.astype(float)
In [21]: b.flags Out[21]: C_CONTIGUOUS : True F_CONTIGUOUS : False OWNDATA : True WRITEABLE : True ALIGNED : True UPDATEIFCOPY : False
In [22]: b.strides Out[22]: (64, 16, 8)
So  ``a.astype(float)`` here has made a new Ccontiguous array, somewhat as implied by the 'copy' explanation in the docstring. In 1.7.0 beta, ``a`` is the same but:
In [22]: b.flags Out[22]: C_CONTIGUOUS : False F_CONTIGUOUS : False OWNDATA : True WRITEABLE : True ALIGNED : True UPDATEIFCOPY : False
In [23]: b.strides Out[23]: (32, 8, 96)
Is this intended? Is there a performance reason to keep the same strides in 1.7.0?
Thanks for any pointers,
Matthew
On Sep 12, 2012, at 1:36 PM, Matthew Brett wrote:
Hi,
We hit a subtle behavior change for the ``astype`` array method between 1.6.1 and 1.7.0 beta.
In 1.6.1:
In [18]: a = np.arange(24).reshape((2, 3, 4)).transpose((1, 2, 0))
In [19]: a.flags Out[19]: C_CONTIGUOUS : False F_CONTIGUOUS : False OWNDATA : False WRITEABLE : True ALIGNED : True UPDATEIFCOPY : False
In [20]: b = a.astype(float)
In [21]: b.flags Out[21]: C_CONTIGUOUS : True F_CONTIGUOUS : False OWNDATA : True WRITEABLE : True ALIGNED : True UPDATEIFCOPY : False
In [22]: b.strides Out[22]: (64, 16, 8)
So  ``a.astype(float)`` here has made a new Ccontiguous array, somewhat as implied by the 'copy' explanation in the docstring. In 1.7.0 beta, ``a`` is the same but:
In [22]: b.flags Out[22]: C_CONTIGUOUS : False F_CONTIGUOUS : False OWNDATA : True WRITEABLE : True ALIGNED : True UPDATEIFCOPY : False
In [23]: b.strides Out[23]: (32, 8, 96)
Is this intended? Is there a performance reason to keep the same strides in 1.7.0?
I believe that this could be because in 1.7.0, NumPy was changed so that copying does not always default to "Corder" but to "Keeporder". So, in 1.7.0, the strides of b is governed by the strides of a, while in 1.6.1, the strides of b is Corder (because of the copy).
Travis
Hi,
On Wed, Sep 12, 2012 at 7:58 PM, Travis Oliphant travis@continuum.io wrote:
On Sep 12, 2012, at 1:36 PM, Matthew Brett wrote:
Hi,
We hit a subtle behavior change for the ``astype`` array method between 1.6.1 and 1.7.0 beta.
In 1.6.1:
In [18]: a = np.arange(24).reshape((2, 3, 4)).transpose((1, 2, 0))
In [19]: a.flags Out[19]: C_CONTIGUOUS : False F_CONTIGUOUS : False OWNDATA : False WRITEABLE : True ALIGNED : True UPDATEIFCOPY : False
In [20]: b = a.astype(float)
In [21]: b.flags Out[21]: C_CONTIGUOUS : True F_CONTIGUOUS : False OWNDATA : True WRITEABLE : True ALIGNED : True UPDATEIFCOPY : False
In [22]: b.strides Out[22]: (64, 16, 8)
So  ``a.astype(float)`` here has made a new Ccontiguous array, somewhat as implied by the 'copy' explanation in the docstring. In 1.7.0 beta, ``a`` is the same but:
In [22]: b.flags Out[22]: C_CONTIGUOUS : False F_CONTIGUOUS : False OWNDATA : True WRITEABLE : True ALIGNED : True UPDATEIFCOPY : False
In [23]: b.strides Out[23]: (32, 8, 96)
Is this intended? Is there a performance reason to keep the same strides in 1.7.0?
I believe that this could be because in 1.7.0, NumPy was changed so that copying does not always default to "Corder" but to "Keeporder". So, in 1.7.0, the strides of b is governed by the strides of a, while in 1.6.1, the strides of b is Corder (because of the copy).
Thanks for the reply.
So maybe the bottom line is that the user should not assume any contiguity from ``astype``? If that's the case I'll submit a docstring PR to say that.
Cheers,
Matthew
Is this intended? Is there a performance reason to keep the same strides in 1.7.0?
I believe that this could be because in 1.7.0, NumPy was changed so that copying does not always default to "Corder" but to "Keeporder". So, in 1.7.0, the strides of b is governed by the strides of a, while in 1.6.1, the strides of b is Corder (because of the copy).
Thanks for the reply.
So maybe the bottom line is that the user should not assume any contiguity from ``astype``? If that's the case I'll submit a docstring PR to say that.
Yes, that would be a great addition to the docstring. Mark, can you confirm this is the desired behavior? Ondrej, this would be something to put in the release notes, if it isn't already.
Thanks,
Trvis
Hi Matt,
On Wed, Sep 12, 2012 at 1:27 PM, Travis Oliphant travis@continuum.io wrote:
Is this intended? Is there a performance reason to keep the same strides in 1.7.0?
I believe that this could be because in 1.7.0, NumPy was changed so that copying does not always default to "Corder" but to "Keeporder". So, in 1.7.0, the strides of b is governed by the strides of a, while in 1.6.1, the strides of b is Corder (because of the copy).
Thanks for the reply.
So maybe the bottom line is that the user should not assume any contiguity from ``astype``? If that's the case I'll submit a docstring PR to say that.
Yes, that would be a great addition to the docstring. Mark, can you confirm this is the desired behavior? Ondrej, this would be something to put in the release notes, if it isn't already.
If you could submit the PR with the docs, that'd be awesome. In the meantime, I've created an issue for it:
https://github.com/numpy/numpy/issues/437
and put it into my TODO list:
https://github.com/numpy/numpy/issues/396
Ondrej
Hi,
On Wed, Sep 12, 2012 at 10:24 PM, Ondřej Čertík ondrej.certik@gmail.com wrote:
Hi Matt,
On Wed, Sep 12, 2012 at 1:27 PM, Travis Oliphant travis@continuum.io wrote:
Is this intended? Is there a performance reason to keep the same strides in 1.7.0?
I believe that this could be because in 1.7.0, NumPy was changed so that copying does not always default to "Corder" but to "Keeporder". So, in 1.7.0, the strides of b is governed by the strides of a, while in 1.6.1, the strides of b is Corder (because of the copy).
Thanks for the reply.
So maybe the bottom line is that the user should not assume any contiguity from ``astype``? If that's the case I'll submit a docstring PR to say that.
Yes, that would be a great addition to the docstring. Mark, can you confirm this is the desired behavior? Ondrej, this would be something to put in the release notes, if it isn't already.
If you could submit the PR with the docs, that'd be awesome. In the meantime, I've created an issue for it:
https://github.com/numpy/numpy/issues/437
and put it into my TODO list:
Sorry  inadequate research on my part  the current docstring for ``astype`` is clear and comprehensive, and the change was obviously intentional.
Cheers,
Matthew
participants (3)

Matthew Brett

Ondřej Čertík

Travis Oliphant