Я пытаюсь написать некоторый код cython для выполнения вычислений с массивами numpy. Кажется, что Cython не нравится [], используемый во всех примерах, которые я видел, чтобы определить тип данных и количество измерений.с использованием numpy в cython: определение ndarray datatype/ndims
К примеру, у меня есть файл 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;
Я компилировать это с помощью setup.py (см конец поста), который я бегу с «питон setup.py build_ext --inplace "
я получаю следующий вывод:
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>
, тогда как, если я удалить "[np.float64_t, ndim = 2]" часть, он работает нормально.
У кого-нибудь есть идеи?
Что касается моей настройки системы: ОС: Windows XP
полная, полная установка PythonXY, версия 2.6.5.1 (последняя на данный момент)
PythonXY якобы идет с Cython, но в конечном итоге установка cython версии 0.12.1 для Python 2.6 с этого сайта: http://www.lfd.uci.edu/~gohlke/pythonlibs/#cython
Я подозреваю, что у меня как-то не хватает пути или что-то в этом роде: я решил некоторые проблемы, явно добавив каталог файла заголовка numpy в путь включения, используемый mingw (см. файл setup.py ниже)
здесь является то, что setup.py файл я упомянул:
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
)
Что вы имеете в виду, 'а если я удалить«[np.float64_t, ndim = 2 ] «часть, она отлично работает».? Вы просто заменяете 'mymatrix'' np.ndarray [np.float64_t, ndim = 2' в двух местах, где это происходит? –
Я не думаю, что вы можете использовать буферный интерфейс ctypedef. Вы должны объявлять его каждый раз с помощью cdef. – carl