[Numpy-discussion] Striding on NumArray objects

Todd Miller jmiller at stsci.edu
Tue Dec 21 07:06:03 CST 2004


On Tue, 2004-12-21 at 08:06, Francesc Altet wrote:
> Hi,
> 
> I'm a bit lost with the next example:
> 
> In [28]: from numarray import *
> In [29]: a=arange(10)
> In [30]: a.iscontiguous()
> Out[30]: 1
> In [31]: b=a[::2]
> In [32]: b.iscontiguous()
> Out[32]: 0
> 
> That seems to suggest that b shares the same data buffer than a. Indeed:
> 
> In [36]: a._data
> Out[36]: <memory at 0x082494d8 with size:0x00000028 held by object 0xb762c260 aliasing object 0x00000000>
> In [37]: b._data
> Out[37]: <memory at 0x082494d8 with size:0x00000028 held by object 0xb762c260 aliasing object 0x00000000>
> 
> At this point, I believe that _bytestride should be different on both
> arrays, but:
> 
> In [33]: a._bytestride
> Out[33]: 4
> In [34]: b._bytestride
> Out[34]: 4
> 
> while I expected to find b._bytestride equal to 8.
> 
> Is that an error or a lack of understanding on my part?

Hi Francesc,

This is a difficult question for me,  but I think the answer is that the
use of _bytestride is very limited.  _bytestride is used to compute the
"natural" strides of an almost contiguous array, e.g. a field of a
recarray.   That is,  given a bytestride and a shape,  the strides of a
field of a contiguous RecArray are implied.  

However,  once we start slicing (say in more than one dimension), 
_strides contains more and more information and is no longer implied by
just the shape and bytestride but also by the history of slicing.  From
that perspective,  it's not clear what _bytestride can be relied upon
for in general or that it needs to be (or can be) kept up to date during
slicing.

FWIW,  looking into this uncovered a related bug in numarray.strings
where I tried to use _bytestride to do a simple iteration over all the
elements of an array...  that doesn't work.

Regards,
Todd






More information about the Numpy-discussion mailing list