Envolviendo std :: array en Cython y exponiéndolo a vistas de memoria

Parece que actualmente hay una solicitud de extracción en el repositorio de Cython para ajustar c ++std::array pero hasta entonces, podría usar algo de ayuda. Actualmente estoy envolviendo elstd::array al igual que:

cdef extern from "<array>" namespace "std" nogil:
    cdef cppclass array2 "std::array<double, 2>":
        array2() except+
        double& operator[](size_t)

Esto funciona, pero tengo que recorrer una vista de memoria de cython, por ejemplo, doble arr [:], y copiar los valores uno por uno. ¿Hay alguna forma más fácil de hacer esto? Esencialmente me gustaría hacer lo siguiente:

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

¿Es esto completamente irracional? Como resultado, trabajando constd::array es extremadamente tedioso porque tengo que tener un bucle for para copiar valores de cython a c ++ y de c ++ a cython. Además, dado que cython no nos da la capacidad de tener parámetros de plantilla que no sean de tipo, tengo que definir un contenedor para cada variación destd::array en mi código Cualquier sugerencia sobre cómo trabajar eficientemente constd::array Sería muy apreciado.

editar:

Ahora puedo pasar de una vista de memoria a un tipo array2 usando lo siguiente:

def __cinit__(self, double[:] mem):
  cdef array2 *arr = <array2 *>(&mem[0])

Pero parece que no importa lo que haga, no puedo hacer que Cython convierta un tipo de matriz2 en una vista de memoria:

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])

Por favor, ayúdame a descubrir cómo lanzar un puntero C ++ a una vista de memoria. Cada combinación que he intentado hasta la fecha ha resultado en algún tipo de error de conversión.

EDITAR: descubrí que debo realizar la siguiente sintaxis sin errores usando una versión más nueva de Cython (estaba usando Cythong 0.22) y actualicé a 0.23.5.

cdef double[::1] mview = <double[:4]>(&arr[0])

Sin embargo, si intento devolver mview desde la función en la que lo estoy usando, obtengo memoria basura. Devolver la vista de memoria al puntero de mi matriz pierde alcance y, por lo tanto, destruye mi matriz automáticamente. Tan pronto como descubra cómo devolver correctamente mi matriz, intentaré actualizar la respuesta oficial.

Respuestas a la pregunta(1)

Su respuesta a la pregunta