vectores una transpuesta multiplicar matriz matrices funcion elementos crear arreglo array agregar python string numpy cython recarray

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