cython: vista de memoria de ndarray de cadenas (o indexación directa de ndarray)
¿Cómo se especifica una vista de memoria de un ndarray que contiene cadenas?
char[:]
, char*[:]
, ... No funcionan.
Para ilustrar, mi problema es la definición de funciónabc(...)
:
cdef void abc(char[:] in_buffer):
cdef char * element
element = address(in_buffer[1])
...
def main():
cdef Py_ssize_t i, n = 100
a = np.array(['ABC', 'D', 'EFGHI'])
for i in range(n):
abc(a)
Si una vista de memoria no es posible, ¿puedo implementar el acceso directo a la matriz yo mismo? Necesito evitar el GIL para la funciónabc(...)
.
Editar 1: En respuesta a la respuesta de Bi Rico.
Mi objetivo es liberar el GIL para la funciónabc(...)
y dentro de él procesan los elementos de cadena dendarray in_buffer
con c funciones de cadena. Es decir. algo como lo siguiente:
cdef void abc(char[:, ::1] in_buffer) nogil:
cdef int max_elt_length = in_buffer.shape[1]+1
cdef char element[max_elt_length+1]
cdef int length
for i in range(in_buffer.shape[0]+1): # is this equivalent to in_buffer.dtype.itemsize + 1 ?
element[max_elt_length] = 0 # add null-terminator for full-size elements
memcpy(element, address(buffer[i, 0]), max_length)
length = strlen(element)
...