Ajouter par programmation des noms de colonne de numpy ndarray
Je suis en train d'ajouter les noms de colonne à un numpy ndarray, puis sélectionnez les colonnes par leur nom. Mais ça ne fonctionne pas. Je ne peux pas dire si le problème survient lorsque j'ajoute les noms, ou plus tard, quand j'essaie de les appeler.
Voici mon code.
data = np.genfromtxt(csv_file, delimiter=',', dtype=np.float, skip_header=1)
#Add headers
csv_names = [ s.strip('"') for s in file(csv_file,'r').readline().strip().split(',')]
data = data.astype(np.dtype( [(n, 'float64') for n in csv_names] ))
Dimension de diagnostic correspondre à ce que j'attends:
print len(csv_names)
>> 108
print data.shape
>> (1652, 108)
"données d'impression.dtype.les noms" renvoie également la sortie attendue.
Mais quand j'ai commencer à appeler les colonnes par leurs noms de champ, tordu les choses se passent. La "colonne" est encore un tableau avec 108 colonnes...
print data["EDUC"].shape
>> (1652, 108)
... et il semble contenir plus de valeurs manquantes qu'il y a de lignes dans le jeu de données.
print np.sum(np.isnan(data["EDUC"]))
>> 27976
Aucune idée de ce qui va mal ici? Ajouter des en-têtes doit être une opération triviale, mais j'ai été la lutte contre ce bug pendant des heures. À l'aide!
OriginalL'auteur Abe | 2012-05-24
Vous devez vous connecter pour publier un commentaire.
Le problème, c'est que vous êtes en train de penser en termes de feuille de calcul comme des tableaux, alors que NumPy n'utilisent différents concepts.
Voici ce que vous devez savoir à propos de NumPy:
Dans votre cas, NumPy serait donc de prendre votre 2-dimensions de tableau normal et de produire un untableau multidimensionnel dont le type est un 108-élément n-uplet (la feuille de calcul de tableau que vous pensez est en 2 dimensions).
Ces choix ont probablement été faite pour des raisons d'efficacité: tous les éléments d'un tableau ont le même type et, par conséquent, ont la même taille: ils peuvent être consultés, à un faible niveau, très simplement et rapidement.
Maintenant, comme user545424 a montré, il y a une simple NumPy réponse à ce que vous voulez faire (
genfromtxt()
accepte unnames
argument avec les noms de colonne).Si vous voulez convertir votre tableau à partir d'une NumPy ndarray à un tableau structuré, vous pouvez le faire:
(vous avez été près: vous avez utilisé
astype()
au lieu deview()
).Vous pouvez également vérifier les réponses à un certain nombre de Stackoverflow questions, y compris La conversion 2D tableau numpy à un tableau structuré et comment faire pour convertir un tableau numpy de tableau d'enregistrements?.
NB: genfromtxt importe le csv dans numpy est structuré tuple format. J'ai essayé tout ce que je pouvais penser pour importer des noms de champ en format de tableau, et rien n'a fonctionné.
Vous pouvez toujours effectuer des multiplications matrice: la
view()
est simplement une autre façon de regarder le de données. Ainsi, vous pouvez travailler avec les données d'origine tableau et leview()
ed tableau en même temps (le premier tableau est en 2D, la deuxième est 1D et structuré).Concernant votre 2ème question: vous pas "dans les noms de champ (2D) format de tableau". Ce concept n'est pas valide dans NumPy (c'est une feuille de calcul concept). Vous voulez un non-structuré/named-colonnes de tableau 2D (votre
data
tableau), ou un 1D structuré/named-colonnes de version (le résultat deview()
dans ma réponse). J'espère que cela aidera à clarifier les choses. 🙂Techniquement, je ne veux pas rendre les choses plus compliquées qu'elles sont, mais notez que vous pouvez avoir un 2D (ou n dimensions) structuré tableau. Cependant, chaque cellule contient un tuple. Exemple:
arr = zeros((3, 5), dtype=[('x', int), ('y', float)])
, avec la structure d'accès commea['x']
, qui retourne un tableau 2D de nombres entiers.OriginalL'auteur Eric Lebigot
Malheureusement, je ne sais pas ce qui se passe lorsque vous essayez d'ajouter les noms de champ, mais je sais que vous pouvez construire le tableau que vous voulez directement à partir du fichier via
EDIT:
Il semble que l'ajout de noms de champ ne fonctionne que lorsque l'entrée est une liste de tuples:
Je commence à me demander si c'est un bug. C'est un comportement très étrange d'avoir du constructeur array agir différemment en fonction du type de la structure imbriquée vous passer.
Vous pouvez comprendre ce comportement si vous connaissez les principes sur lesquels NumPy (vous pouvez par exemple vérifier ma réponse). En un mot: tuple() est une sorte de "type fondamental" (comme flotteurs), pour NumPy (de sorte que vous obtenez une sorte de tableau structuré, lorsque vous passez des tuples), alors que le passage des listes ou des tableaux d'entrée signifie "ajouter une autre dimension de la matrice (vous obtenez un tableau de nombres, généralement).
OriginalL'auteur user545424