Pasar una matriz numpy estructurada con cadenas a una función cython


Estoy intentando crear una función en cython que acepte una matriz estructurada numpy o una matriz de registro definiendo un tipo de estructura cython. Supongamos que tengo los datos:

a = np.recarray(3, dtype=[('a', np.float32),  ('b', np.int32), ('c', '|S5'), ('d', '|S3')])
a[0] = (1.1, 1, 'this\0', 'to\0')
a[1] = (2.1, 2, 'that\0', 'ta\0')
a[2] = (3.1, 3, 'dogs\0', 'ot\0')

(Nota: el problema descrito a continuación ocurre con o sin el terminador nulo)

Entonces tengo el código cython:

import numpy as np
cimport numpy as np

cdef packed struct tstruct:
    np.float32_t a
    np.int32_t b
    char[5] c
    char[3] d

def test_struct(tstruct[:] x):
    cdef:
        int k
        tstruct y

    for k in xrange(3):
        y = x[k]
        print y.a, y.b, y.c, y.d

Cuando intento ejecutar test_struct(a), obtengo el error:

ValueError: Expected a dimension of size 5, got 8

Si en la matriz y la estructura correspondiente se reordenan de tal manera que los campos que contienen cadenas no son adyacentes a entre sí, entonces la función funciona como se espera. Parece como si la función Cython no está detectando correctamente el límite entre los campos c y d y piensa como si estuviera pasando un array char de la suma de las longitudes.

A falta de reorganizar los datos (lo cual es posible pero no ideal), ¿hay otra manera de pasar un recarray con datos de cadena de longitud fija a Cython?

Actualización: Esto parece ser un posible error de Cython. Vea lo siguiente discusión sobre el grupo de Google Cython que insinúa dónde está surgiendo el problema:

Https://groups.google.com/forum/#! topic / cython-users / TbLbXdi0_h4

Actualización 2: Este error se ha corregido en la rama master cython en Github a partir del 23 de febrero de 2014 y el parche está programado para su inclusión en la v0.20.2: https://github.com/cython/cython/commit/58d9361e0a6d4cb3d4e87775f78e0550c2fea836

Author: JoshAdel, 2014-01-29

1 answers

Este fue un error que se ha corregido en la rama master cython en Github a partir del 22 de febrero de 2014 y el parche está programado para su inclusión en la v0.20.2: https://github.com/cython/cython/commit/58d9361e0a6d4cb3d4e87775f78e0550c2fea836

 1
Author: JoshAdel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-14 20:29:19