[Numpy-discussion] PyArray_SETITEM with object arrays in Cython

Dag Sverre Seljebotn dagss at student.matnat.uio.no
Wed Mar 4 06:18:43 EST 2009


Wes McKinney wrote:
> This still doesn't explain why the buffer interface was slow.
I finally remembered to look at this; there seems to be a problem in 
your code:
> def reindexObject(ndarray[object, ndim=1] index,
>                   ndarray[object, ndim=1] arr,
>                   dict idxMap):
>     '''
>     Using the provided new index, a given array, and a mapping of 
> index-value
>     correpondences in the value array, return a new ndarray conforming to
>     the new index.
>     '''
>     cdef object idx, value
>
>     cdef int length  = index.shape[0]
>     cdef ndarray[object, ndim = 1] result = np.empty(length, dtype=object)
>   
>     cdef int i = 0
>     for i from 0 <= i < length:
>         idx = index[i]
>         if not PyDict_Contains(idxMap, idx):
>             result[i] = None
>             continue
>         value = arr[idxMap[idx]]
>         result[i] = value
>     return result

The problem is with arr[idxMap[idx]]. The result from idxMap[idx] is a 
Python object which leads to non-efficient indexing. Use 
arr[<int>idxMap[idx]] instead.

Dag Sverre



More information about the NumPy-Discussion mailing list