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

问题描述 投票:0回答:9

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

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
9个回答
16
投票
如果列数不相等,

genfromtxt
将会出现此错误。

我可以想到 3 种方法:

1。使用

usecols
参数

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

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

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

3.使用

genfromtxt:

以外的其他内容

........................这样


6
投票

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

  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=False
    case_sensitive='upper'
    ) 或小写 (
    case_sensitive='lower'
    ).

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

参考:numpy.genfromtxt


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)

4
投票

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

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

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

示例 csv 文件

  • 1,你好,#这个,失败了
  • 1,你好,',这个',失败

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

    将 numpy 导入为 numpy 数据 = numpy.genfromtxt(文件, 分隔符=分隔符) #Error

环境注意事项:

操作系统:Ubuntu

csv 编辑器:LibreOffice

IDE:Pycharm


2
投票

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

错误是:

"Line #88 (got 1435 columns instead of 1)"

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

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

帮我修好了。


1
投票

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


1
投票

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

您可以:

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

2) 使用 genfromtxt() 中的跳过头 例如,

np.genfromtxt('myfile', skip_header=*how many lines to skip*, delimiter=' ')
更多信息请参阅文档


0
投票

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

数据格式为:

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

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 中显式定义 comment 参数。

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

根据文档:

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

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


0
投票

如果无效_加注: -> 2309 引发值错误(errmsg) 第2310章 第2311章 第2312章

ValueError:检测到一些错误! 第 2 行(有 11 列,而不是 12 列) 第 3 行(有 11 列,而不是 12 列) 第 4 行(有 11 列,而不是 12 列) 第 5 行(有 10 列而不是 12 列)

寻找答案

© www.soinside.com 2019 - 2024. All rights reserved.