использование numpy в cython: определение типа данных ndarray / ndims - PullRequest
8 голосов
/ 31 июля 2010

Я пытаюсь написать некоторый код на Cython для вычислений с массивами numpy.Кажется, Cython не нравится [], используемый во всех примерах, которые я видел, чтобы определить тип данных и число измерений.

Например, у меня есть файл 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 (см. Конец поста), который запускаю с помощью "python 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
)

Ответы [ 2 ]

3 голосов
/ 12 декабря 2010

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

def hat (ndarray[np.float64_t, ndim=2] x):
    a = np.zeros((3,3));
    a[0,1] =  x[2,0];
    etc.
0 голосов
/ 26 ноября 2010

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

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

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

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

Louis

...