在numpy中出现"获得1列而不是..."错误
我正在编写以下代码,用于在训练集和测试集上进行随机森林分类;
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 个回答
之前的回答对我没用,所以我来分享一个新的解决办法,方便以后搜索的人:
错误信息是:"第88行(得到了1435列,而不是1列)"
我发现我的csv文件其实是一个带有BOM的utf8编码文本文件(BOM是文件第一行的一个字符,用来标记编码。大多数文本编辑器会隐藏这个字符)。
我只是用Windows的记事本打开这个文件,然后选择“另存为”,在保存框底部选择“ANSI”。
这样就解决了我的问题。
在我的情况下,错误是因为行中有一个特殊符号。
错误原因:包含了特殊字符,比如
- '#' 井号
- ',' 由于你的分隔符是 ','
示例 csv 文件
- 1,hello,#this,失败
1,hello,',this',失败
-----代码-----
import numpy as numpy data = numpy.genfromtxt(file, delimiter=delimeter) #错误
环境说明:
操作系统: Ubuntu
csv 编辑器: LibreOffice
开发环境: Pycharm
你在某一行中有太多的列。比如说:
>>> 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)
如果在列的数量上发现不一致,就会出现一个异常错误。可能有很多原因和解决办法。
可以添加
invalid_raise = False
来跳过出问题的行。例如,你可以这样写:
dataset = genfromtxt(open('data.csv','r'), delimiter='', invalid_raise = False)
如果你的数据里有名字,确保字段名里没有空格或其他无效字符,也不要用标准属性的名字(比如 size 或 shape),这样会让解释器搞混。
deletechars
这个选项会给出一个字符串,里面包含所有需要从名字中删除的字符。默认情况下,无效字符包括
~!@#$%^&*()-=+~\|]}[{';: /?.>,<.
excludelist
这个选项提供一个要排除的名字列表,比如
return, file, print…
如果输入的名字在这个列表里,就会在它后面加一个下划线 ('_')。
case_sensitive
这个选项决定名字是否区分大小写(
case_sensitive=True
),或者转换成大写(case_sensitive=False
或case_sensitive='upper'
),或者转换成小写(case_sensitive='lower'
)。
data = np.genfromtxt("data.txt", dtype=None, names=True,\
deletechars="~!@#$%^&*()-=+~\|]}[{';: /?.>,<.", case_sensitive=True)
参考资料:numpy.genfromtxt