【问题标题】:"Got 1 columns instead of ..." error in numpy“得到 1 列而不是 ...”numpy 中的错误
【发布时间】:2014-06-14 17:41:31
【问题描述】:

我正在编写以下代码,用于在训练集和测试集上执行随机森林分类;

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

关于如何避免它的任何建议?谢谢。

【问题讨论】:

    标签: python numpy genfromtxt


    【解决方案1】:

    以前的答案都对我不起作用,所以对于未来的谷歌人来说,这里是另一个答案:

    错误是:"Line #88 (got 1435 columns instead of 1)"

    发现我的 csv 文件是一个带有 BOM 的 utf8 编码文本文件(文件第一行上标记编码的字符。大多数文本编辑器会隐藏这个字符)

    我只是在Windows的记事本中打开它,再次“另存为”并在保存框底部选择“ANSI”。

    帮我修好了。

    【讨论】:

      【解决方案2】:

      如果检测到列数不一致,则会引发异常。可能有多种原因和解决方案。

      1. 添加invalid_raise = False 以跳过违规行。

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

      2. 如果您的数据包含名称,请确保字段名称不包含任何空格或无效字符,或者它不对应于标准属性的名称(如大小或形状),这将迷惑口译员。

      1. deletechars

        给出一个字符串,该字符串组合了必须从名称中删除的所有字符。默认情况下,无效字符是 ~!@#$%^&*()-=+~\|]}[{';: /?.>,<.

      2. excludelist

        给出要排除的名称列表,例如return, file, print… 如果输入名称之一是此列表的一部分,则下划线 字符('_')将附加到它。

      3. case_sensitive

        名称是否区分大小写(case_sensitive=True),转换为大写 (case_sensitive=Falsecase_sensitive='upper') 或小写 (case_sensitive='lower')。

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

      参考:numpy.genfromtxt

      【讨论】:

        【解决方案3】:

        在我的例子中,错误是由于行中有一个特殊符号而引起的。

        错误原因:有特殊字符如

        • '#'哈希
        • ',' 鉴于您的 (delimiter = ',')

        示例 csv 文件

        • 1,你好,#this,失败
        • 1,hello,',this',失败

          -----代码-----

          将 numpy 导入为 numpy data = numpy.genfromtxt(file, delimiter=delimeter) #Error

        环境说明:

        操作系统:Ubuntu

        csv 编辑器:LibreOffice

        IDE:Pycharm

        【讨论】:

          【解决方案4】:

          当我尝试使用 genfromtext 加载文本数据集并使用 Keras 进行文本分类时,我也遇到了这个错误。

          数据格式为:[some_text]\t[class_label]。 我的理解是第一列中有一些字符会以某种方式混淆解析器,并且无法正确拆分两列。

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

          这个 sn-p 与你的创建了相同的 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);
          

          根据文档:

          可选参数 cmets 用于定义字符串 这标志着评论的开始。默认情况下, genfromtxt 假设 cmets='#'。注释标记可以出现在行的任何位置。 任何 注释标记后出现的字符将被忽略

          表示注释的默认字符是“#”,因此如果该字符包含在您的文本列中,则后面的所有内容都会被忽略。这可能是 genfromtext 无法识别这两列的原因。

          【讨论】:

            【解决方案5】:

            包含列名的标题似乎比数据本身多 1 列(标题为 1435 列,数据为 1434 列)。

            你可以:

            1) 从标题中删除 1 列对数据没有意义的列

            2) 使用 genfromtxt() 中的跳过标头 例如,np.genfromtxt('myfile', skip_header=*how many lines to skip*, delimiter=' ') 更多信息见documentation

            【讨论】:

              【解决方案6】:

              我遇到了这个错误。原因是我的数据中有一个包含空格的条目。这导致它将其视为额外的行。确保所有数据中的所有间距都是一致的。

              【讨论】:

                【解决方案7】:

                如果列数不相等,genfromtxt 会报此错误。

                我可以想到 3 种解决方法:

                1.使用usecols参数

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

                但是 - 这可能意味着您丢失了一些数据(行长于 1434 列) - 这是否重要取决于您。

                2。调整您的输入数据文件,使其具有相同数量的列。

                3.使用genfromtxt:以外的其他内容@

                ................like this

                【讨论】:

                  【解决方案8】:

                  您的某一行中有太多列。例如

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

                  【讨论】:

                  • 如果列数不相等,我们能做到这一点吗?
                  猜你喜欢
                  • 2015-10-26
                  • 2021-10-29
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-01-31
                  相关资源
                  最近更新 更多