29 votos

Pasando una estructura numpy matriz de cadenas a un cython función

Estoy intentando crear una función en cython que acepta una colección estructurada de la matriz o array del registro mediante la definición de una cython struct tipo. 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 que se describe a continuación se produce con o sin el terminador nulo)

Luego tengo las cython código:

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), me sale el error:

ValueError: Expected a dimension of size 5, got 8

Si en la matriz y la correspondiente estructura se reordenan tal que los campos que contienen las cadenas no son adyacentes el uno al otro, entonces la función funciona como se esperaba. Parece como si el Cython función no está detectando el límite entre el c y d campos correctamente y piensa como si estás de paso en una matriz de char de la suma de las longitudes.

Corto de la redistribución de los datos (lo cual es posible, pero no ideal), ¿hay otra forma de pasar un recarray con cadena de longitud fija de datos en Cython?

Actualización: Este parece ser un potencial Cython error. Consulte la siguiente discusión sobre la Cython grupo de google que sugerencias en donde el problema no está presente:

https://groups.google.com/forum/#!tema/cython-usuarios/TbLbXdi0_h4

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

1voto

JoshAdel Puntos 15911

Este fue un error que se ha fijado en el maestro cython rama en Github como de 22 de Febrero de 2014 y el parche está programado para su inclusión en v0.20.2: https://github.com/cython/cython/commit/58d9361e0a6d4cb3d4e87775f78e0550c2fea836

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X