2015-06-09 13 views
7

Ho una lista, my_list, con tipi di dati misti che voglio convertire in una matrice numpy. Tuttavia, ottengo l'errore TypeError: expected a readable buffer object. Vedi il codice qui sotto. Ho provato a basare il mio codice su NumPy documentation.Numpy dtype per elenco con tipi di dati misti

my_list = [['User_0', '2012-2', 1, 6, 0, 1.0], ['User_0', '2012-2', 5, 6, 0, 1.0], ['User_0', '2012-3', 0, 0, 4, 1.0]] 
my_np_array = np.array(my_list, dtype='S30, S8, i4, i4, f32') 

risposta

11

Perché non utilizzare dtype=object?

In [1]: my_list = [['User_0', '2012-2', 1, 6, 0, 1.0], ['User_0', '2012-2', 5, 
6, 0, 1.0], ['User_0', '2012-3', 0, 0, 4, 1.0]] 
In [2]: my_np_array = np.array(my_list, dtype=object) 
In [3]: my_np_array 
Out[3]: 
array([['User_0', '2012-2', 1, 6, 0, 1.0], 
     ['User_0', '2012-2', 5, 6, 0, 1.0], 
     ['User_0', '2012-3', 0, 0, 4, 1.0]], dtype=object) 

Nota È circa l'utilizzo della memoria, quando si specifica il DTYPE di ogni colonna, la memoria allocata al vostro ndarray sarà meno rispetto a quando si utilizza dtype=object che contengono tutti i tipi possibili in python in modo che la memoria allocata per ogni colonna sarà massima.

+0

Quali sono i pro e i contro dell'uso di 'dtype = object' vs. la specifica di ogni tipo di dati? – pir

+0

@felbo Ho modificato la mia risposta :) – farhawa

5

I suoi elementi nidificati devono essere tuple anche omesso uno i4 nelle tipologie:

>>> my_np_array = np.array(map(tuple,my_list), dtype='|S30, |S8, i4, i4, i4, f32') 
>>> my_np_array 
array([('User_0', '2012-2', 1, 6, 0, 1.0), 
     ('User_0', '2012-2', 5, 6, 0, 1.0), 
     ('User_0', '2012-3', 0, 0, 4, 1.0)], 
     dtype=[('f0', 'S30'), ('f1', 'S8'), ('f2', '<i4'), ('f3', '<i4'), ('f4', '<i4'), ('f5', '<f4')]) 

Per quanto è noto in quanto di uso NumPy tuple per preservare i suoi tipi, quando si è utilizzato il tipo multiplo per elementi di matrice è necessario convertire i sub array in tuple come dtype elementi.

+1

Sì, i dati per un array di strutture (tipo di carattere complesso come questo) dovrebbero essere un elenco di tuple. I dati non vengono effettivamente memorizzati come tuple, ma hanno scelto la notazione tuple per input e display. Questo è distinto dalla solita lista di liste usate per gli array nd. – hpaulj

+0

@hpaulj Effettivamente. è così! – Kasramvd

Problemi correlati