|
From: Sasha <nd...@ma...> - 2006-02-02 23:38:32
|
I don't know if this came from numarray or not, but for me as someone who transitions from Numeric, the "strides" attribute to an ndarray is a a new feature. I've spend some time playing with it and there are some properties that I dislike. Some of these undesired properties are probably bugs and easy to fix, but others require some discussion. 1. Negative strides: >>> x =3D zeros(5) >>> x.strides=3D (-4,) >>> x array([ 0, 25, 0, -136009696, -136009536]) Looks like a bug. PyArray_CheckStrides only checks for one end of the buffer. It is easy to fix that by disallowing negative strides, but I think that would be wrong. In my view. the right sollution is to pass offset to PyArray_CheckStrides and check for both ends of the buffer.=20 The later will change C-API. 2. Zero strides: >>> x =3D arange(5) >>> x.strides =3D 0 >>> x array([0, 0, 0, 0, 0]) >>> x +=3D 1 >>> x array([5, 5, 5, 5, 5]) These are somewhat puzzling properties unless you know the internals. I believe ndarray with 0s in strides are quite useful and will follow up with the description of the properties I would expect from them. 3. "Fractional" strides: I call "fractional" strides that are not a multiple of "itemsize". >>> x =3D arange(5) >>> x.strides =3D 3 >>> x array([ 0, 256, 131072, 50331648, 3]) I think these should be disallowed. It is just too easy to forget that strides are given in bytes, not in elements. Ideally rather than checking for strides[i] % itemsize, I would just make strides[i] to be expressed in number of elements, not in bytes. This can be done without changing the way strides are stored internally - just multiply by itemsize in set_strides and divide in get_strides. If strides attribute was not introduced before numpy, this change should not cause any compatibility problems. If it has some history of use, it may be possible to depricate "strides" (with a deprecation warning) and introduce a different attribute, say "steps", that will be expressed in number of elements. |