Reputation: 3413
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
)
Upvotes: 8
Views: 2588
Reputation: 6539
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.
Upvotes: 3
Reputation: 1432
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
Upvotes: 0