2012-03-02 8 views
28

estoy corriendo genfromtxt, como a continuación:numpy.genfromtxt produce un conjunto de tuplas que parecen matrices 2D, ¿por qué?

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

Dónde input.txt es de this gist.

Cuando miro a los resultados, es una matriz 1D no es una matriz 2D:

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

Parece que es un conjunto de tuplas en su lugar:

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

Si quito los convertidores especificación de la llamada genfromtxt funciona bien y produce una matriz 2D:

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

Respuesta

38

lo se devuelve se llama estructurado ndarray, ver, por ejemplo, aquí: http://docs.scipy.org/doc/numpy/user/basics.rec.html. Esto se debe a que sus datos no son homogéneos, es decir, no todos los elementos tienen el mismo tipo: los datos contienen ambas cadenas (las dos primeras columnas) y flotantes. Las matrices numeradas deben ser homogéneas (ver here para una explicación).

Las matrices estructuradas 'resuelven' esta restricción de homogeneidad usando tuplas para cada registro o fila, esa es la razón por la cual la matriz devuelta es 1D: una serie de tuplas, pero cada tupla (fila) consta de varios datos, por lo que puede considerarlo como filas y columnas. Las diferentes columnas son accesibles como a['nameofcolumn'], en su caso, por ejemplo, a['Julian_Day'].

El motivo por el que devuelve una matriz 2D al eliminar los convertidores de las dos primeras columnas es que, en ese caso, genfromtxt considera todos los datos del mismo tipo y se devuelve una ndarray normal (el tipo predeterminado es flotante, pero puede especificar esto con el argumento dtype).

EDITAR: Si desea hacer uso de los nombres de columna, puede utilizar el argumento names (y establecer la skip_header en sólo tres):

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

el que puede hacer por ejemplo:

>>> 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') 
Cuestiones relacionadas