Пример Cython для отправки массива / вектора в скрипт c ++ - PullRequest
0 голосов
/ 20 июня 2020

Допустим, у нас есть одномерный массив numpy или список, который мы используем в качестве входных данных для функции, например fun c (np.array [1.5, 2.5, 3.5]), где эта функция берется из завернутый класс c ++, и наша цель - распечатать значения этого массива или вектора внутри сценария c ++.

Однако я не знаю, как определить функцию C ++ для этого вопроса и указать ее в файле pyx . И хотел спросить, можете ли вы поделиться таким простым фрагментом, как указанная выше функциональность, где низкая задержка имеет наибольшее значение.

В основном, на стороне C ++ я хочу сделать:

void func (/* where I don't what to write */) {

std::cout <<  array_[0] << std::endl; // which prints 1.5 (since np.array[1.5, 2.5, 3.5][0] was 1.5)
std::cout <<  array_[1] << std::endl; // which prints 2.5 (since np.array[1.5, 2.5, 3.5][1] was 2.5)
std::cout <<  array_[2] << std::endl; // which prints 3.5 (since np.array[1.5, 2.5, 3.5][2] was 3.5)
}

Кажется, что memoryviews предлагает возможное решение, которое также имеет низкую задержку, однако, глядя на документацию Cython о memoryviews , я очень запутался.

Пример отсюда упоминает (int * a, int n) как аргумент вышеупомянутой функции, но я не понял, что такое a и n и как я могу индексировать массив на стороне С ++. И, наконец, написание зеркала pyx также для меня непонятно.

Я был бы признателен, если бы кто-нибудь мог дать очень простой пример фрагмента для такой функции C ++ и ее аналога pyx. Также приветствуются любые предложения, отличные от memoryviews, которые не являются медленными:)

1 Ответ

2 голосов
/ 20 июня 2020
  • a - это переменная, которая содержит указатель на ноль или более int.
  • n - это количество значений, которые содержит a.

Вы можете индексировать a, используя стандартный синтаксис доступа к массивам C ++ a[i]. Убедитесь, что i < n.

Заголовок C ++ будет выглядеть так:

void func(int *a, int n);

Файл .pyx будет выглядеть примерно так:

cdef extern from "myheader.hpp":
    void func(int *a, int n)

def func_wrapper(int[::1] mview):
    func(&mview[0], mview.shape[0])

Вам нужно будет скомпилируйте его обычным способом , указав в списке источников как ваш исходный файл Cython, так и исходный файл C (файл. cpp, а не заголовок).

...