Estoy tratando de convertir una matriz bidimensional en una matriz estructurada con campos con nombre. Quiero que cada fila en la matriz 2D sea un nuevo registro en la matriz estructurada. Desafortunadamente, nada de lo que he intentado funciona de la manera que esperaba.Convertir una matriz numpy 2D en una matriz estructurada
estoy empezando con:
>>> myarray = numpy.array([("Hello",2.5,3),("World",3.6,2)])
>>> print myarray
[['Hello' '2.5' '3']
['World' '3.6' '2']]
Quiero convertir a algo que se parece a esto:
>>> newarray = numpy.array([("Hello",2.5,3),("World",3.6,2)], dtype=[("Col1","S8"),("Col2","f8"),("Col3","i8")])
>>> print newarray
[('Hello', 2.5, 3L) ('World', 3.6000000000000001, 2L)]
Lo que he intentado:
>>> newarray = myarray.astype([("Col1","S8"),("Col2","f8"),("Col3","i8")])
>>> print newarray
[[('Hello', 0.0, 0L) ('2.5', 0.0, 0L) ('3', 0.0, 0L)]
[('World', 0.0, 0L) ('3.6', 0.0, 0L) ('2', 0.0, 0L)]]
>>> newarray = numpy.array(myarray, dtype=[("Col1","S8"),("Col2","f8"),("Col3","i8")])
>>> print newarray
[[('Hello', 0.0, 0L) ('2.5', 0.0, 0L) ('3', 0.0, 0L)]
[('World', 0.0, 0L) ('3.6', 0.0, 0L) ('2', 0.0, 0L)]]
Ambos estos enfoques intentan convertir cada entrada en myarray en un registro con el tipo de letra dado, por lo que se insertan los ceros adicionales. No puedo entender cómo convertir cada fila en un registro.
Otro intento:
>>> newarray = myarray.copy()
>>> newarray.dtype = [("Col1","S8"),("Col2","f8"),("Col3","i8")]
>>> print newarray
[[('Hello', 1.7219343871178711e-317, 51L)]
[('World', 1.7543139673493688e-317, 50L)]]
Esta vez no se realiza ninguna conversión real. Los datos existentes en la memoria solo se vuelven a interpretar como el nuevo tipo de datos.
La matriz que estoy comenzando se está leyendo desde un archivo de texto. Los tipos de datos no se conocen con anticipación, por lo que no puedo establecer el tipo en el momento de la creación. Necesito una solución elegante y de alto rendimiento que funcione bien para casos generales ya que haré este tipo de conversión muchas, muchas veces para una gran variedad de aplicaciones.
Gracias!
con 'fromrecords' se puede evitar el' transpose() ' –