2012-07-03 14 views
24

Ho due matrici diverse, una con archi e l'altra con int. Voglio concatenarli, in un array in cui ogni colonna ha il tipo di dati originale. La mia attuale soluzione per fare ciò (vedi sotto) converte l'intero array in dtype = string, che sembra molto inefficiente nella memoria.Memorizza diversi tipi di dati in un array NumPy?

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

E 'possibile mutiple dtypes in combined_array quando A.dtype = string e B.dtype = int?

+3

La domanda è su come utilizzare una matrice NumPy. Tuttavia, se disporre di un array NumPy non è essenziale, un [Pandas DataFrame] (http://pandas.pydata.org/pandas-docs/stable/dsintro.html#dataframe) funzionerebbe bene per questa situazione. – crayzeewulf

risposta

24

Un approccio potrebbe essere l'utilizzo di record array. Le "colonne" non sarà come le colonne di array NumPy standard, ma per la maggior parte dei casi d'uso, questo è sufficiente:

>>> 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]) 

Nota che si può anche fare qualcosa di simile con una gamma di serie, specificando il tipo di dati l'array. Questo è noto come 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 differenza è che gli array di dischi permettono anche attribuire accesso ai singoli campi di dati. Gli array standard strutturati 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

Questa alternativa ha funzionato bene, grazie. – veor

3

Una soluzione semplice: convertire i dati di opporsi 'O' tipo

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

crea la matrice:

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