在numpy中出现"获得1列而不是..."错误

17 投票
8 回答
72599 浏览
提问于 2025-04-18 04:40

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

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

有没有什么建议可以避免这个错误呢?谢谢。

8 个回答

2

之前的回答对我没用,所以我来分享一个新的解决办法,方便以后搜索的人:

错误信息是:"第88行(得到了1435列,而不是1列)"

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

我只是用Windows的记事本打开这个文件,然后选择“另存为”,在保存框底部选择“ANSI”。

这样就解决了我的问题。

4

在我的情况下,错误是因为行中有一个特殊符号

错误原因:包含了特殊字符,比如

  • '#' 井号
  • ',' 由于你的分隔符是 ','

示例 csv 文件

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

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

    import numpy as numpy data = numpy.genfromtxt(file, delimiter=delimeter) #错误

环境说明:

操作系统: Ubuntu

csv 编辑器: LibreOffice

开发环境: Pycharm

4

你在某一行中有太多的列。比如说:

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

如果在列的数量上发现不一致,就会出现一个异常错误。可能有很多原因和解决办法。

  1. 可以添加 invalid_raise = False 来跳过出问题的行。

    例如,你可以这样写:dataset = genfromtxt(open('data.csv','r'), delimiter='', invalid_raise = False)

  2. 如果你的数据里有名字,确保字段名里没有空格或其他无效字符,也不要用标准属性的名字(比如 size 或 shape),这样会让解释器搞混。

  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

16

genfromtxt 这个函数会在列数不一致时出现错误。

我想到三种解决办法:

1. 使用 usecols 参数

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

不过,这样可能会导致你丢失一些数据(如果某些行的列数超过了1434列),这是否重要就看你自己了。

2. 调整你的输入数据文件,使其列数一致。

3. 使用其他方法,而不是 genfromtxt:

.............比如这样

撰写回答