2012-03-02 13 views
28

Sto correndo genfromtxt come di seguito:numpy.genfromtxt produce una serie di elementi che sembrano tuple, non un array 2D, perché?

date_conv = lambda x: str(x).replace(":", "/") 
time_conv = lambda x: str(x) 

a = np.genfromtxt(input.txt, delimiter=',', skip_header=4, 
     usecols=[0, 1] + radii_indices, converters={0: date_conv, 1: time_conv}) 

Dove input.txt da this gist.

Quando guardo i risultati, è una matrice 1D non una matrice 2D:

>>> np.shape(a) 
(918,) 

Sembra essere un array di tuple invece:

>>> a[0] 
('06/03/2006', '08:27:23', 6.4e-05, 0.000336, 0.001168, 0.002716, 0.004274, 0.004658, 0.003756, 0.002697, 0.002257, 0.002566, 0.003522, 0.004471, 0.00492, 0.005602, 0.006956, 0.008442, 0.008784, 0.006976, 0.003917, 0.001494, 0.000379, 6.4e-05) 

Se rimuovo i convertitori specificazione dalla chiamata genfromtxt funziona benissimo e produce una matrice 2D:

>>> np.shape(a) 
(918, 24) 

risposta

38

Cosa viene restituito è chiamato strutturato ndarray, vedere ad esempio qui: http://docs.scipy.org/doc/numpy/user/basics.rec.html. Questo perché i tuoi dati non sono omogenei, cioè non tutti gli elementi hanno lo stesso tipo: i dati contengono sia stringhe (le prime due colonne) che float. Gli array di Numpy devono essere omogenei (vedere here per una spiegazione).

Gli array strutturati 'risolve' questo vincolo di omogeneità utilizzando tuple per ogni record o riga, questo è il motivo della matrice restituita è 1D: una serie di tuple, ma ogni tupla (riga) è costituito da diversi dati, in modo da può considerarlo come righe e colonne. Le diverse colonne sono accessibili come a['nameofcolumn'], nel tuo caso ad esempio a['Julian_Day'].

Il motivo per cui restituisce un array 2D quando si rimuovono i convertitori per le prime due colonne è che in quel caso, genfromtxt riguarda tutti i dati dello stesso tipo e viene restituito un normale array ND (il tipo predefinito è float, ma è possibile specificare questo con l'argomento dtype).

EDIT: Se si vuole fare uso dei nomi di colonna, è possibile utilizzare l'argomento names (e impostare la skip_header a soli tre):

a2 = np.genfromtxt("input.txt", delimiter=',', skip_header=3, names = True, dtype = None, 
        usecols=[0, 1] + radii_indices, converters={0: date_conv, 1: time_conv}) 

la si può fare ad esempio:

>>> a2['Dateddmmyyyy'] 
array(['06/03/2006', '06/03/2006', '18/03/2006', '19/03/2006', 
     '19/03/2006', '19/03/2006', '19/03/2006', '19/03/2006', 
     '19/03/2006', '19/03/2006'], 
     dtype='|S10') 
Problemi correlati