Обёртывание std :: array в Cython и предоставление его представлениям памяти
Кажется, что в настоящее время в репозитории Cython есть запрос на извлечение, чтобы обернуть c ++std::array
но до тех пор я мог бы помочь. Я в настоящее время оборачиваюstd::array
вот так:
cdef extern from "<array>" namespace "std" nogil:
cdef cppclass array2 "std::array<double, 2>":
array2() except+
double& operator[](size_t)
Это работает, но я должен перебрать представление памяти Cython, скажем, double arr [:], и скопировать значения одно за другим. Есть ли более простой способ сделать это? По сути, я хотел бы сделать следующее:
cdef double arr[2]
arr[0] = 1.0
arr[1] = 2.0
cdef array2 array2_arr = arr
#and the reverse
cdef array2 reverse
reverse[0] = 1.0
reverse[1] = 2.0
cdef double reverse_arr[2] = reverse
Это совершенно неразумно? В результате работа сstd::array
Это очень утомительно, потому что у меня есть цикл for для копирования значений из Cython в C ++ и из C ++ в Cython. Кроме того, поскольку Cython не дает нам возможности иметь нетипизированные параметры шаблона, я должен определить оболочку для каждого вариантаstd::array
в моем коде. Любые предложения о том, как эффективно работать сstd::array
будет принята с благодарностью.
редактировать:
Теперь я могу перейти от представления памяти к типу array2, используя следующее:
def __cinit__(self, double[:] mem):
cdef array2 *arr = <array2 *>(&mem[0])
Но похоже, что независимо от того, что я делаю, я не могу заставить Cython преобразовать тип array2 в представление памяти:
cdef array2 arr = self.thisptr.getArray()
# error: '__pyx_t_1' declared as a pointer to a reference of type 'double &'
cdef double[::1] mview = <double[:2]>(&arr[0])
#OR
# Stop must be provided to indicate shape
cdef double[::1] mview = <double[::2]>(&arr[0])
Пожалуйста, помогите мне понять, как привести указатель C ++ к представлению памяти. Каждая комбинация, которую я пробовал на сегодняшний день, приводила к некоторой ошибке приведения.
РЕДАКТИРОВАТЬ: я обнаружил, что я должен выполнить следующий синтаксис без ошибок, используя более новую версию Cython (я использовал Cythong 0.22) и обновлен до 0.23.5.
cdef double[::1] mview = <double[:4]>(&arr[0])
Однако, если я пытаюсь вернуть mview из функции, в которой я его использую, я получаю мусорную память. Возвращение обзора памяти к указателю моего массива теряет область видимости и поэтому автоматически уничтожает мой массив. Как только я выясню, как правильно вернуть мой массив, я попытаюсь обновить официальный ответ.