Обёртывание 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 из функции, в которой я его использую, я получаю мусорную память. Возвращение обзора памяти к указателю моего массива теряет область видимости и поэтому автоматически уничтожает мой массив. Как только я выясню, как правильно вернуть мой массив, я попытаюсь обновить официальный ответ.

Ответы на вопрос(1)

Ваш ответ на вопрос