2010-07-31 2 views
8

Я пытаюсь написать некоторый код 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 
) 
+0

Что вы имеете в виду, 'а если я удалить«[np.float64_t, ndim = 2 ] «часть, она отлично работает».? Вы просто заменяете 'mymatrix'' np.ndarray [np.float64_t, ndim = 2' в двух местах, где это происходит? –

+1

Я не думаю, что вы можете использовать буферный интерфейс ctypedef. Вы должны объявлять его каждый раз с помощью cdef. – carl

ответ

3

Поместите информацию о типе в объявлении функции, как:

def hat (ndarray[np.float64_t, ndim=2] x): 
    a = np.zeros((3,3)); 
    a[0,1] = x[2,0]; 
    etc. 
0

Я думаю, что вы не можете сделать это прямо: вы должны проверить форму и тип в функции

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

и только cdeftype np.ndarray mymatrix в заголовке

НО вы теряете типизацию значений матрицы , поэтому вам нужно назначить каждое значение, которое вы обрабатываете float64_t: но какова должна быть эффективность?

Луи

Смежные вопросы