2012-07-03 28 views
24

Tengo dos matrices diferentes, una con cadenas y otra con ints. Quiero concatenarlos, en una matriz donde cada columna tiene el tipo de datos original. Mi solución actual para hacer esto (ver a continuación) convierte toda la matriz en dtype = string, lo que parece muy ineficiente en la memoria.¿Almacena diferentes tipos de datos en una matriz NumPy?

combined_array = np.concatenate((A, B), axis = 1)

¿Es posible mutiple dtypes en combined_array cuando A.dtype = string y B.dtype = int?

+3

La pregunta es acerca del uso de una matriz NumPy. Sin embargo, si tener una matriz NumPy no es esencial, un [Pandas DataFrame] (http://pandas.pydata.org/pandas-docs/stable/dsintro.html#dataframe) funcionaría bien para esta situación. – crayzeewulf

Respuesta

24

Un enfoque podría ser utilizar un record array. Las "columnas" no será como las columnas de las matrices numpy estándar, pero para la mayoría de los casos de uso, esto es suficiente:

>>> a = numpy.array(['a', 'b', 'c', 'd', 'e']) 
>>> b = numpy.arange(5) 
>>> records = numpy.rec.fromarrays((a, b), names=('keys', 'data')) 
>>> records 
rec.array([('a', 0), ('b', 1), ('c', 2), ('d', 3), ('e', 4)], 
     dtype=[('keys', '|S1'), ('data', '<i8')]) 
>>> records['keys'] 
rec.array(['a', 'b', 'c', 'd', 'e'], 
     dtype='|S1') 
>>> records['data'] 
array([0, 1, 2, 3, 4]) 

Tenga en cuenta que también se puede hacer algo similar con un conjunto estándar especificando el tipo de datos de la matriz Esto se conoce como un "structured array":

>>> arr = numpy.array([('a', 0), ('b', 1)], 
         dtype=([('keys', '|S1'), ('data', 'i8')])) 
>>> arr 
array([('a', 0), ('b', 1)], 
     dtype=[('keys', '|S1'), ('data', '<i8')]) 

La diferencia es que las matrices de registro también permiten atribuir el acceso a los campos de datos individuales. Las matrices estructuradas estándar no.

>>> records.keys 
chararray(['a', 'b', 'c', 'd', 'e'], 
     dtype='|S1') 
>>> arr.keys 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'numpy.ndarray' object has no attribute 'keys' 
+0

Esta alternativa funcionó bien, gracias. – veor

3

Una solución simple: convertir sus datos de oponerse 'O' tipo

z = np.zeros((2,2), dtype='U2') 
o = np.ones((2,1), dtype='O') 
np.hstack([o, z]) 

crea la matriz:

array([[1, '', ''], 
     [1, '', '']], dtype=object) 
Cuestiones relacionadas