numpy中有“1列而不是......”错误

时间:2014-04-29 00:42:40

标签: python numpy genfromtxt

我正在使用以下代码在火车和测试集上执行随机森林分类;

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

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

8 个答案:

答案 0 :(得分:11)

如果列数不相等,

genfromtxt将会出现此错误。

我可以想出3种方法:

<强> 1。使用usecols参数

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

然而 - 这可能意味着您丢失了一些数据(行数超过1434列) - 无论重要性是由您决定的。

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

第3。使用genfromtxt:

以外的内容

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

答案 1 :(得分:3)

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

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

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

  2. 如果您的数据包含名称,请确保字段名称不包含任何空格或无效字符,或者它与标准属性的名称(如大小或形状)不对应,混淆翻译。

  3.   
        
    1. deletechars

           

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

    2.   
    3. excludelist

           

      提供要排除的名称列表,例如return, file, print…如果其中一个输入名称是此列表的一部分,则为下划线   字符('_')将被附加到它。

    4.   
    5. case_sensitive

           

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

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

    参考:numpy.genfromtxt

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

你可以:

1)从标题中删除1列,但对数据

没有意义

OR

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

答案 5 :(得分:1)

在我的情况下,由于在行中包含特殊符号而引起了错误。

错误原因:具有特殊字符,例如

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

csv文件示例

  • 1,您好, #this ,失败
  • 1,你好,',此,失败

    ----- CODE -----

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

环境说明:

操作系统:Ubuntu

csv编辑器:LibreOffice

IDE :Pycharm

答案 6 :(得分:0)

当我还尝试使用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无法识别两列的原因。

答案 7 :(得分:0)

以前的答案都没有对我有用,因此对于未来的Google员工来说,另外一个答案是:

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

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

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

为我修复了。