Ошибка "1 столбцы вместо..." в numpy

Я работаю над следующим кодом для выполнения классификации случайных лесов в наборах поездов и тестов;

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

Однако я получаю следующую ошибку при выполнении:

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

Любые предложения относительно того, как избежать этого? Спасибо.

Ответ 1

genfromtxt даст эту ошибку, если количество столбцов неравномерно.

Я могу подумать о 3 способах этого:

1. Используйте параметр usecols

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

Однако это может означать, что вы потеряете некоторые данные (где строки длиннее 1434 столбцов) - независимо от того, важно это или нет.

2. Откорректируйте файл входных данных так, чтобы он имел равное количество столбцов.

3. Используйте что-то другое, кроме genfromtxt:

............. вот так

Ответ 2

Исключение возникает, если в количестве столбцов обнаружено несоответствие. Возможен ряд причин и решений.

  1. Добавьте invalid_raise = False чтобы пропустить ошибочные строки.

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

  2. Если ваши данные содержат имена, убедитесь, что имя поля не содержит пробелов или недопустимых символов или что оно не соответствует имени стандартного атрибута (например, размера или формы), что могло бы сбить с толку интерпретатора.

  1. deletechars

    Дает строку, объединяющую все символы, которые должны быть удалены из имени. По умолчанию недопустимыми являются символы [email protected]#$%^&*()-=+~\|]}[{';:/?.>,<.

  2. excludelist

    Предоставляет список исключаемых имен, например return, file, print… Если одно из входных имен является частью этого списка, к нему будет добавлен символ подчеркивания ('_').

  3. case_sensitive

    Должны ли имена быть чувствительными к регистру (case_sensitive=True), преобразованы в верхний регистр (case_sensitive=False или case_sensitive='upper') или в нижний регистр (case_sensitive='lower').

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

Ссылка: numpy.genfromtxt

Ответ 3

У вас слишком много столбцов в одной из ваших строк. Например

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

Ответ 4

У меня была эта ошибка. Причиной была одна запись в моих данных, в которой было место. Это заставило его увидеть его как дополнительную строку. Убедитесь, что все интервалы согласованы во всех данных.

Ответ 5

Кажется, что заголовок, который содержит имена столбцов, имеет еще 1 столбец, чем сами данные (1435 столбцов на заголовке против 1434 на данные).

Вы можете:

1) Исключите 1 столбец из заголовка, который не имеет смысла с данными

ИЛИ

2) Используйте заголовок пропуска из genfromtxt() например, np.genfromtxt('myfile', skip_header=*how many lines to skip*, delimiter=' ') более подробная информация содержится в документации.

Ответ 6

В моем случае ошибка возникла из-за наличия специального символа в строке.

Причина ошибки: наличие специальных символов, таких как

  • '#' хеш
  • ',' учитывая тот факт, что ваш (delimiter = ',')

Пример CSV файла

  • 1, привет, # это, не удается
  • 1, привет, ', это', не удается

    -----КОД-----

    импортировать numpy как numpy data = numpy.genfromtxt(file, delimiter = delimeter) # Ошибка

Примечание по окружающей среде:

ОС: Ubuntu

CSV редактор: LibreOffice

IDE: Pycharm

Ответ 7

У меня также была эта ошибка, когда я также пытался загрузить текстовый набор данных с помощью genfromtext и классифицировать текст с помощью Keras.

Формат данных: [some_text]\t[class_label]. Мое понимание заключалось в том, что в 1-м столбце есть некоторые символы, которые каким-то образом путают синтаксический анализатор, и эти два столбца не могут быть разделены должным образом.

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

этот фрагмент создавал тот же ValueError с вашим, и моим первым обходным решением было читать все как один столбец:

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

и разделить данные позже.

Однако, что в конечном итоге работало правильно, явное определение параметра комментария в genfromtxt.

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

Согласно документации:

Необязательные комментарии аргументов используются для определения символьной строки что знаменует начало комментария. По умолчанию genfromtxt предполагает комментарии = '#'. Маркер комментариев может появляться в любом месте на линии. Любые символ, присутствующий после маркера (-ов) комментария, просто игнорируется.

символ по умолчанию, обозначающий комментарий, равен '#', и, таким образом, если этот символ включен в ваш текстовый столбец, после него все игнорируется. Вероятно, поэтому два столбца не могут быть распознаны genfromtext.