Передача массивов Numpy в код C, обернутый Cython - PullRequest
16 голосов
/ 21 декабря 2010

У меня есть небольшой кусочек кода на C, который я хочу обернуть, используя Cython. Я хочу иметь возможность установить ряд пустых массивов, а затем передать эти массивы в качестве аргументов в код C, функции которого принимают стандартные массивы c (1d и 2d). Я немного застрял с точки зрения выяснения того, как написать правильный код .pyx для правильной обработки вещей.

Есть несколько функций, но типичная функция в файле funcs.h выглядит примерно так:

double InnerProduct(double *A, double **coords1, double **coords2, const int len)

У меня есть файл .pyx с соответствующей строкой:

cdef extern from "funcs.h":
    double InnerProduct(double *A, double **coords1, double **coords2, int len)

, где я избавился от const , потому что Cython не поддерживает его. Я застрял в том, как должен выглядеть код-обертка для передачи массива MxN NumPy в аргументы ** corres1 и **ordins2.

Я изо всех сил пытался найти правильную документацию или учебные пособия для этого типа проблемы. Любые предложения будут наиболее ценными.

Ответы [ 2 ]

2 голосов
/ 02 февраля 2016

Возможно, вам нужна функция "типизированных просмотров памяти" в Cython, о которой вы можете прочитать в деталях здесь .По сути, это более новый, более унифицированный способ работы с NumPy или другими массивами.Они могут быть представлены в Python-land как массивы или вы можете экспортировать их в Python (например, здесь ).Вы должны обратить внимание на то, как работает шаг и убедиться, что вы согласны, например, с C-смежными или FORTRAN-подобными массивами, но в документах достаточно ясно, как это сделать.

Не знаяНемного больше о вашей функции. Трудно быть более конкретным о том, как лучше всего это сделать - то есть, является ли функция C доступной только для чтения для массивов?(Я думаю, что да, основываясь на подписи, которую вы дали, но я не уверен на 100%.) Если это так, вам не нужно беспокоиться о том, чтобы делать копии, если это необходимо для получения C-смежных состояний, потому что функция C не должна говоритьвернуться к массиву NumPy уровня Python.Но напечатанные просмотры памяти позволят вам сделать это с минимумом суеты.

0 голосов
/ 21 декабря 2010

Код интерфейса Cython должен быть создан в соответствии с руководством здесь .

Чтобы получить указатель C на данные в массиве numpy, вы должны использовать атрибут ctypes массива numpy, который описан здесь .

...