On Mon, 2013-04-08 at 12:31 +0200, Dag Sverre Seljebotn wrote:
> On 04/08/2013 09:59 AM, Sebastian Berg wrote:
> > On Mon, 2013-04-08 at 08:42 +0200, Dag Sverre Seljebotn wrote:
> >> On 04/06/2013 04:19 PM, Nathaniel Smith wrote:
> >>> Hi all,
> >>>
> >>> If you build current numpy master with
> >>>     NPY_RELAXED_STRIDES_CHECKING=1 python setup.py install
> >>> then Cython code using ndarrays starts blowing up, e.g.:
> >>>
> >>> # foo.pyx
> >>> def add_one(array):
> >>>       cdef double[::1] a = array
> >>>       a[0] += 1.
> >>>       return array
> >>>
> >>>>>> foo.add_one(np.ascontiguousarray(np.arange(10.)[::100]))
> >>> Traceback (most recent call last):
> >>>     File "<stdin>", line 1, in <module>
> >>>     File "foo.pyx", line 2, in foo.add_one (foo.c:1210)
> >>>       cdef double[::1] a = array
> >>> ValueError: Buffer and memoryview are not contiguous in the same 
> >>> dimension.
> >>>
> >>> The problem (as discussed before) is that Cython has an unnecessarily
> >>> strict definition of "contiguous", so NPY_RELAXED_STRIDES_CHECKING=1
> >>> pretty much breaks all existing compiled Cython modules.
> >>>
<snip>
> >>
> >> I guess you have changed your implementation of PEP 3118 too slightly on
> >> the NumPy side? Is this undefined in the PEP or are you now not in
> >> strict adherence to it?
> >>
> >
> > Hi,
> >
> > maybe I will have a look at that, but not sure if I will manage.  The
> > PEP 3118 is a point, but it does not seem to cover this (probably we
> > should try to get a clarification into 3118).  I am still wondering
> > whether for buffers that are requested contiguous numpy should set the
> > strides again, since it cannot hurt.  Would that make a difference for
> > Cython? I expected Cython just got any buffer and then checked the
> > strides instead of requesting the buffer contiguous and then double
> > checking.
> 
> At least when I implemented
> 
> cdef np.ndarray[double, mode='fortran'] arr
> 
> that relies on PEP 3118 contiguous-flags and I did no checking myself. 
> Lots of Cython code does this instead of memoryviews (I still write my 
> own code that way).

Yeah, though even if numpy "fixes" the buffer strides, `arr.strides`
points at the original array I believe, leaving it to the user. But that
just means users have to be a bit more careful with strides.

I think I will have numpy "fix" the buffers stride anyway (when
requested contiguous through the buffer protocol).  I cannot think of
any reason not to do it and it may work around bugs in extensions which
may not even be aware of numpy's existence.

> 
> The memory views OTOH does their own checking, but I also see plenty of 
> references to PyBUF_C_CONTIGUOUS etc. inside 
> Cython/Utility/MemoryView.pyx, so perhaps it does both. Mark would have 
> the definitive answer here.
> 

After a quick check, it seems to me that those are there for exposing
the memoryviews buffer and not for getting a buffer from another object.

- Sebastian

> Dag Sverre
> _______________________________________________
> cython-devel mailing list
> cython-devel@python.org
> http://mail.python.org/mailman/listinfo/cython-devel
> 


_______________________________________________
cython-devel mailing list
cython-devel@python.org
http://mail.python.org/mailman/listinfo/cython-devel

Reply via email to