Empacotando std :: array no Cython e expondo-o a visualizações de memória

Parece que atualmente há uma solicitação pull no repo do Cython para agrupar c ++std::array mas até então, eu poderia usar alguma ajuda. No momento, estou encerrando ostd::array igual a:

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

Isso funciona, mas eu tenho que fazer um loop sobre uma exibição de memória cython, digamos, double arr [:] e copie os valores um por um. Há uma maneira mais fácil de fazer isso? Essencialmente, eu gostaria de fazer o seguinte:

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

Isso é completamente irracional? Como resultado, trabalhando comstd::array é extremamente tedioso, porque eu tenho que ter um loop for para copiar valores de cython para c ++ e de c ++ para cython. Além disso, como o cython não nos permite ter parâmetros de modelo que não sejam do tipo, eu tenho que definir um wrapper para cada variação destd::array no meu código Todas as sugestões sobre como trabalhar com eficiênciastd::array seria muito apreciada.

editar:

Agora eu sou capaz de ir de uma exibição de memória para um tipo de array2 usando o seguinte:

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

Mas parece que não importa o que eu faça, não consigo que o cython converta um tipo de array2 em um memoryview:

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, ajude-me a descobrir como converter um ponteiro C ++ em uma exibição de memória. Todas as combinações que tentei até agora resultaram em algum tipo de erro de conversão.

EDIT: Descobri que devo executar a seguinte sintaxe sem erros usando uma versão mais recente do Cython (eu estava usando o Cythong 0.22) e atualizei para 0.23.5.

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

No entanto, se eu tentar retornar o mview da função em que o estou usando, obtenho memória de lixo. Retornar a memória para o ponteiro da minha matriz perde o escopo e, portanto, destrói minha matriz automaticamente. Assim que descobrir como retornar corretamente minha matriz, tentarei atualizar a resposta oficial.

questionAnswers(1)

yourAnswerToTheQuestion