8

I'm trying to write some cython code to do computations with numpy arrays. Cython seems to not like the [] used in all the examples I've seen to define the datatype and number of dimensions.

For example, I have a file test.pyx:

cimport numpy as np
import numpy as np

ctypedef np.ndarray[np.float64_t, ndim=2] mymatrix

cpdef mymatrix hat (mymatrix x):
    a = np.zeros((3,3));
    a[0,1] =  x[2,0];
    a[0,2] = -x[1,0];
    a[1,2] =  x[0,0];
    a[1,0] = -x[2,0];
    a[2,0] =  x[1,0];
    a[2,1] = -x[0,0];
    return a;

I compile this using a setup.py (see end of post), which I run with "python setup.py build_ext --inplace"

I get the following output:

running build_ext
cythoning test.pyx to test.c

Error converting Pyrex file to C:
------------------------------------------------------------
...
cimport numpy as np
import numpy as np

ctypedef np.ndarray[np.float64_t, ndim=2] mymatrix
                                         ^
------------------------------------------------------------

test.pyx:4:42: Syntax error in ctypedef statement

<snip, irrelevant>

whereas if I remove the "[np.float64_t, ndim=2]" part, it works fine.

Does anyone have any ideas?

As to my system setup: OS: Windows XP

full, complete pythonxy installation, version 2.6.5.1 (latest at this point)

pythonxy supposedly comes with cython, but I ended up installing cython version 0.12.1 for Python 2.6 from this site: http://www.lfd.uci.edu/~gohlke/pythonlibs/#cython

I suspect that I somehow am missing a path or something: I solved some problems by explicitly adding the numpy header file directory to the include path used by mingw (see the setup.py file below)

here is that setup.py file I mentioned:

from distutils.core import setup
from distutils.extension import Extension
from distutils.sysconfig import get_python_inc
from Cython.Distutils import build_ext
import os.path

inc_base = get_python_inc( plat_specific=1 );
incdir = os.path.join( get_python_inc( plat_specific=1 ), );

#libraries=['math'],
ext_modules = [Extension("test", 
 ["test.pyx"], 
 include_dirs = [
  os.path.join(inc_base,'..\\Lib\\site-packages\\numpy\\core\\include\\numpy'),
  ]
 )
 ]

setup(
  name = 'test',
  cmdclass = {'build_ext': build_ext},
  ext_modules = ext_modules
)
2
  • What do you mean by, whereas if I remove the "[np.float64_t, ndim=2]" part, it works fine.? Are you just replacing mymatrix with np.ndarray[np.float64_t, ndim=2 in the two places that it occurs? Commented Aug 7, 2010 at 6:02
  • 1
    I don't think you can use the buffer interface with ctypedef. You have to declare it every time with cdef. Commented Aug 16, 2010 at 10:07

2 Answers 2

3

Put the type information in the declaration of the function, as in:

def hat (ndarray[np.float64_t, ndim=2] x):
    a = np.zeros((3,3));
    a[0,1] =  x[2,0];
    etc.
Sign up to request clarification or add additional context in comments.

Comments

0

I think you cannot do it directly: you have to check the shape and type in the function

assert x.shape[0] == 2
assert x.dtype == np.float64

and only cdeftype np.ndarray mymatrix in the header

BUT you lose the typing of matrix values you thus have to assign each value you process to float64_t: but what should be the efficency?

Louis

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.