web-dev-qa-db-fra.com

"Vous avez 1 colonnes au lieu de ..." erreur dans numpy

Je travaille sur le code suivant pour effectuer la classification aléatoire des forêts sur des trains et des ensembles d’essais;

from sklearn.ensemble import RandomForestClassifier
from numpy import genfromtxt, savetxt

def main():
    dataset = genfromtxt(open('filepath','r'), delimiter=' ', dtype='f8')   
    target = [x[0] for x in dataset]
    train = [x[1:] for x in dataset]
    test = genfromtxt(open('filepath','r'), delimiter=' ', dtype='f8')

    rf = RandomForestClassifier(n_estimators=100)
    rf.fit(train, target)
    predicted_probs = [[index + 1, x[1]] for index, x in enumerate(rf.predict_proba(test))]

    savetxt('filepath', predicted_probs, delimiter=',', fmt='%d,%f', 
            header='Id,PredictedProbability', comments = '')

if __name__=="__main__":
    main()

Cependant, j'obtiens l'erreur suivante lors de l'exécution.

---->      dataset = genfromtxt(open('C:/Users/Saurabh/Desktop/pgm/Cora/a_train.csv','r'), delimiter='', dtype='f8')

ValueError: Some errors were detected !
    Line #88 (got 1435 columns instead of 1434)
    Line #93 (got 1435 columns instead of 1434)
    Line #164 (got 1435 columns instead of 1434)
    Line #169 (got 1435 columns instead of 1434)
    Line #524 (got 1435 columns instead of 1434)
...
...
...

Des suggestions quant à la façon de l'éviter? Merci.

10
user3466132

genfromtxt donnera cette erreur si le nombre de colonnes est différent.

Je peux penser à 3 façons de le contourner:

1. Utilisez le paramètre usecols

np.genfromtxt('yourfile.txt',delimiter=',',usecols=np.arange(0,1434))

Cependant, cela peut signifier que vous perdez certaines données (où les lignes ont plus de 1434 colonnes), que cela vous importe ou non.

2. Ajustez votre fichier de données d'entrée afin qu'il ait un nombre égal de colonnes.

3. Utilisez autre chose que genfromtxt:

............. comme ça

11
atomh33ls

Une exception est générée si une incohérence est détectée dans le nombre de colonnes. Plusieurs raisons et solutions sont possibles.

  1. Ajoutez invalid_raise = False pour ignorer les lignes incriminées.

    dataset = genfromtxt(open('data.csv','r'), delimiter='', invalid_raise = False)

  2. Si vos données contiennent des noms, assurez-vous que le nom du champ ne contient pas d’espace ni de caractère non valide, ou qu’il ne correspond pas au nom d’un attribut standard (comme la taille ou la forme), ce qui risquerait de confondre l’interpréteur.

  1. deletechars 

    Donne une chaîne combinant tous les caractères à supprimer du nom. Par défaut, les caractères non valides sont ~!@#$%^&*()-=+~\|]}[{';: /?.>,<.

  2. excludelist

    Donne une liste des noms à exclure, tels que return, file, print… Si l'un des noms d'entrée fait partie de cette liste, un caractère de soulignement ('_') Sera ajouté à celle-ci.

  3. case_sensitive

    Indique si les noms doivent être sensibles à la casse (case_sensitive=True), convertis en majuscules (case_sensitive=False ou case_sensitive='upper') ou en minuscules (case_sensitive='lower').

data = np.genfromtxt("data.txt", dtype=None, names=True,\
       deletechars="~!@#$%^&*()-=+~\|]}[{';: /?.>,<.", case_sensitive=True)

Référence: numpy.genfromtxt

3
zeeshan khan

Vous avez trop de colonnes dans l'une de vos lignes. Par exemple

>>> import numpy as np
>>> from StringIO import StringIO
>>> s = """
... 1 2 3 4
... 1 2 3 4 5
... """
>>> np.genfromtxt(StringIO(s),delimiter=" ")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python2.6/site-packages/numpy/lib/npyio.py", line 1654, in genfromtxt
    raise ValueError(errmsg)
ValueError: Some errors were detected !
    Line #2 (got 5 columns instead of 4)
2
user545424

Il semble que l'en-tête comprenant les noms de colonne comporte une colonne de plus que les données elles-mêmes (1435 colonnes sur l'en-tête contre 1434 sur les données).

Vous pouvez soit:

1) Éliminer 1 colonne de l'en-tête qui n'a pas de sens avec les données

OR

2) Utilisez l’en-tête de saut de genfromtxt () Par exemple, np.genfromtxt('myfile', skip_header=*how many lines to skip*, delimiter=' ') Pour plus d’informations figurant dans documentation .

1
tadf2

J'ai eu cette erreur. La cause était une seule entrée dans mes données qui avait un espace. Cela l'a amené à le voir comme une rangée supplémentaire. Assurez-vous que tous les espacements sont cohérents dans toutes les données.

1
Jonathon D

Dans mon cas, l'erreur a été provoquée par la présence d'un symbole spécial dans la ligne.

Cause d'erreur: avoir des caractères spéciaux comme

  • '#' hash 
  • ',' étant donné que votre (délimiteur = ',')

Exemple de fichier csv

  • 1, bonjour, #this , échoue 
  • 1, bonjour, ', this' , échoue

    -----CODE-----

    importer numpy en tant que numpy data = numpy.genfromtxt (fichier, délimiteur = délimiteur) #Error

Note sur l'environnement:

OS: Ubuntu 

éditeur csv : LibreOffice

IDE: Pycharm 

1
hemant c

J'ai également eu cette erreur lorsque j'essayais également de charger un jeu de données texte avec genfromtext et de faire une classification de texte avec Keras.

Le format de données était le suivant: [some_text]\t[class_label]. Je croyais comprendre que la 1ère colonne contient des caractères qui confondent l’analyseur et que les deux colonnes ne peuvent pas être fractionnées correctement.

data = np.genfromtxt(my_file.csv, delimiter='\t', usecols=(0,1), dtype=str);

cet extrait a créé la même valeur ValueError avec le vôtre et ma première solution de contournement consistait à tout lire dans une colonne:

data = np.genfromtxt(my_file, delimiter='\t', usecols=(0), dtype=str);

et diviser les données plus tard par moi-même.

Cependant, ce qui a finalement fonctionné correctement a été de définir explicitement le paramètre comment dans genfromtxt.

data = np.genfromtxt(my_file, delimiter='\t', usecols=(0,1), dtype=str, comments=None);

Selon la documentation:

L'argument facultatif commentaires permet de définir une chaîne de caractères Qui marque le début d'un commentaire. Par défaut, genfromtxt suppose que Comments = '#'. Le marqueur de commentaire peut apparaître n'importe où sur la ligne. Tout caractère Présent après le ou les marqueurs de commentaire est simplement ignoré .

le caractère par défaut qui indique un commentaire est '#', et donc si ce caractère est inclus dans votre colonne de texte, tout est ignoré après celle-ci. C'est probablement pourquoi les deux colonnes ne peuvent pas être reconnues par genfromtext.

0
KLaz