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.