2016-04-25 3 views
1

Mon fichier CSV comporte un mélange de chaînes et de colonnes numériques. nump.recfromcsv les inférée avec précision (woo-hoo) donnant une DTYPE derecopiage numpy de CSV dtype a beaucoup de colonnes mais la forme dit juste une rangée, pourquoi est-ce?

DTYPE = [('null', 'S7'), ('00', '< f8'), ('nsubj', « S20 '), (' g ',' S1 '), ...

Donc un mélange de chaînes et de chiffres comme vous pouvez le voir. Mais numpy.shape(csv) me donne

(133433,)

Ce qui me confond, car DTYPE impliquait qu'il était au courant colonne. En outre, il accède de manière intuitive:

csv[1] 
> ('def', 0.0, 'prep_to', 'g', 'query_w', 'indef', 0.0, ... 

Je reçois aussi l'erreur

ne peut pas effectuer de réduire avec type flexible

sur les opérations comme .tout(), même lors de l'utilisation d'une colonne numérique . Je ne suis pas sûr si je travaille vraiment avec une entité semblable à une table (deux dimensions) ou juste une liste de quelque chose. Pourquoi le dtype est-il incompatible avec la forme?

+0

Jetez un oeil à ma réponse récente concernant 'genfromtxt' et' dtype', http://stackoverflow.com/a/36814096/901925. Je ne suis pas aussi familier avec 'recfromcsv', mais je pense que les tableaux seront similaires, un tableau 1d avec un composé' dtype'. Vous accédez aux lignes (enregistrements) par numéro, champs (colonnes) par nom. Pour un 'recarray',' csr.null' devrait vous donner un tableau de la 1ère colonne, les noms 'S7'. – hpaulj

Répondre

2

Un recarray est un tableau d'enregistrements. Chaque enregistrement peut avoir plusieurs champs. Un enregistrement est un peu comme une structure dans C.

Si la forme du recarray est (133433,) alors le recarray est un tableau multidimensionnel .

Les champs du recarray peuvent être accédés par l'indexation basée sur le nom. Par exemple, csv['nsub'] et est essentiellement équivalente à

np.array([record['nsub'] for record in csv]) 

Cette indexation en fonction de nom spécial prend en charge l'illusion d'une 1-dimensionnelle recarray est un tableau à 2 dimensions - csv[intval] sélectionne les lignes, csv[fieldname] sélectionne « colonnes ». Cependant, sous le capot et strictement parlant si la forme est (133433,) alors il est unidimensionnel.

Notez que tous les recarrays ne sont pas unidimensionnels. Il est possible d'avoir une dimension supérieure recarray,

In [142]: arr = np.zeros((3,2), dtype=[('foo', 'int'), ('bar', 'float')]) 

In [143]: arr 
Out[143]: 
array([[(0, 0.0), (0, 0.0)], 
     [(0, 0.0), (0, 0.0)], 
     [(0, 0.0), (0, 0.0)]], 
     dtype=[('foo', '<i8'), ('bar', '<f8')]) 

In [144]: arr.shape 
Out[144]: (3, 2) 

C'est un tableau à 2 dimensions, dont les éléments sont des documents.

Voici les valeurs de champ bar dans la tranche arr[:, 0]:

In [148]: arr[:, 0]['bar'] 
Out[148]: array([ 0., 0., 0.]) 

Voici toutes les valeurs de champ bar dans le tableau 2D:

In [151]: arr['bar'] 
Out[151]: 
array([[ 0., 0.], 
     [ 0., 0.], 
     [ 0., 0.]]) 

In [160]: arr['bar'].all() 
Out[160]: False 

Notez qu'une alternative à l'utilisation recarrays est Pandas Dataframes . Il y a beaucoup plus de méthodes disponibles pour manipuler des données que des recarrays. Vous pourriez le trouver plus pratique.

+0

le dtype semblait stocker toutes les informations de type pour chaque colonne - il le fait sans traiter un tableau d'enregistrements comme multidimensionnel? – djechlin

+0

Apparemment, oui. J'ai aussi appris cela à partir de la réponse d'unutbu. Mais la réponse et votre observation sont cohérentes. Le type encapsule la 2ème dimension. Donc votre exemple se comporte plus comme une liste de listes et moins comme un tableau 2D. – roadrunner66

+1

Avec un 'dtype' différents champs peuvent avoir différents' dtype' et taille. Dans un tableau 'n-d', chaque élément a les mêmes' dtype' et 'nbytes'. Un composant 'dtype' ajoute un nouveau type de dimensionnalité dans le tableau' n-d'. Il y a un chevauchement dans les concepts, mais aussi une discontinuité fondamentale. – hpaulj