Передача массивов Numpy на C-код, завернутый в Cython
У меня есть небольшой бит существующего кода на C, который я хочу обернуть, используя Cython. Я хочу иметь возможность настроить несколько массивов numpy, а затем передать эти массивы в качестве аргументов в код 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 в аргументы ** coords1 и ** coords2.
Я изо всех сил пытался найти правильную документацию или учебники для этой проблемы. Любые предложения были бы наиболее оценены.
Ответы
Ответ 1
Вероятно, вы хотите, чтобы функция CyTon "напечатала память", о которой вы можете прочитать в деталях здесь. Это в основном новый, более унифицированный способ работы с numpy или другими массивами. Они могут быть выставлены на Python-land в виде массивов numpy или вы можете экспортировать их в Python (например, здесь). Вы должны обратить внимание на то, как работает шагование, и убедитесь, что вы согласны с этим, например. C-смежные по сравнению с массивами, подобными FORTRAN, но в документах довольно ясно, как это сделать.
Не зная немного больше о своей функции, трудно быть более конкретным с наилучшим способом сделать это, т.е. является ли функция C только для чтения для массивов? (Я думаю, что да, основываясь на подписи, которую вы дали, но я не уверен на 100%.) Если вам не нужно беспокоиться о том, чтобы сделать копии, если необходимо, для получения C-смежных состояний, потому что функции C не нужно говорить Вернемся к массиву numpy на уровне Python. Но типизированные просмотры памяти позволят вам сделать все это с минимумом суеты.
Ответ 2
Код интерфейса cython должен быть создан в соответствии с инструкцией, приведенной здесь.
Чтобы получить C-указатель на данные в массиве numpy, вы должны использовать атрибут ctypes массива numpy, который описывается здесь здесь.