[Numpy-discussion] Cython/NumPy syntax

Dag Sverre Seljebotn dagss at student.matnat.uio.no
Wed Aug 6 11:04:39 EDT 2008


Dag Sverre Seljebotn wrote:
> Travis E. Oliphant wrote:
>> Gael Varoquaux wrote:
>>> On Wed, Aug 06, 2008 at 10:35:06AM +0200, Dag Sverre Seljebotn wrote:
>>>   
>>>> Stéfan van der Walt wrote:
>>>>     
>>>>> 2008/8/6 Dag Sverre Seljebotn <dagss at student.matnat.uio.no>:
>>>>>       
>>>>>> - Require an ndim keyword:
>>>>>>         
>>>   
>>>>>> cdef numpy.ndarray[numpy.int64, ndim=2]
>>>>>>         
>> Just out of curiousity.  What is the problem with using parenthesis for 
>> this purpose?
>>
>> cdef numpy.ndarray(dtype=numpy.int64, ndim=2)
> 
> There's no technical problem, but we thought that it looked too much 
> like constructor syntax -- it looks like an ndarray is constructed. If 
> one is new to Cython this is what you will assume, at least the [] makes 
> you stop up and think more.
> 
> (Which, for clarity, I should mention that it is not -- you'd do
> 
> cdef np.ndarray(dtype=np.int64, ndim=1) buf = \
>    np.array([1,2,3], dtype=np.int64)
> 
> to construct a new array and get buffer access to it right away).

I realize that I've given too little context for this discussion. This 
tends to get rather longwinded, but I'll provide it for whoever is 
interested.

What I am doing is supporting general syntax candy for the buffer PEP 
(and a backwards compatability layer for earlier Python versions) so that

cdef object[float, 2] buf = input

acquires a buffer and lets you use it using the indexing operator with 2 
native int indices, as well as letting other operations (also any 
indexing that doesn't have exactly 2 ints) fall through to the 
underlying object.

The most explicit syntax would be

cdef ndarray arr = input
cdef buffer[float, 2] buf = cython.getbuffer(arr)
arr += 4.3
buf[3,2] = 2

But that is very unfriendly to use. A step down in explicitness is

cdef buffer(ndarray, float, 2) arr = input
arr += 4.3 # falls through to ndarray type
arr[3,2] = 2 # uses buffer

But overall just adding something to the end of ndarray and make it 
completely transparent seemed most usable.

(Another option would be "cdef ndarray,buffer(float,2) arr = ...", i.e. 
arr "has two types".).

-- 
Dag Sverre



More information about the NumPy-Discussion mailing list