multiplicar - transpuesta de una matriz en python numpy
Pasar una matriz numpy estructurada con cadenas a una funciĆ³n de cython (1)
Estoy intentando crear una función en cython que acepte una matriz de registro o de registro estructurado numpy 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)
Luego 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)
, test_struct(a)
el error:
ValueError: Expected a dimension of size 5, got 8
Si en la matriz y la estructura correspondiente se reordenan de manera tal que los campos que contienen cadenas no son adyacentes entre sí, entonces la función funciona como se espera. Parece como si la función de Cython no estuviera detectando correctamente el límite entre los campos d
y piensa como si estuvieras pasando en una matriz de caracteres de la suma de las longitudes.
Aparte 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 error potencial de Cython. Vea la siguiente discusión en el grupo de Google Cython que sugiere 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 de cython maestro en Github a partir del 23 de febrero de 2014 y el parche está programado para su inclusión en v0.20.2: https://github.com/cython/cython/commit/58d9361e0a6d4cb3d4e87775f78e0550c2fea836
Este fue un error que se ha corregido en la rama de cython maestro en Github a partir del 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