web-dev-qa-db-ja.com

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

それをどのように回避するかについての提案はありますか?ありがとう。

11
user3466132

genfromtxtは、列の数が等しくない場合にこのエラーを出します。

私はそれを回避する3つの方法を考えることができます:

1。 usecols パラメータを使用します

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

ただし、これは一部のデータ(行が1434列より長い場合)が失われることを意味する場合があります。

2。同じ数の列になるように入力データファイルを調整します。

3。 genfromtxt:以外のものを使用してください

............. このように

12
atomh33ls

列の数に不整合が検出されると、例外が発生します。いくつかの理由と解決策が考えられます。

  1. 問題の行をスキップするには、_invalid_raise = False_を追加します。

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

  2. データに名前が含まれている場合は、フィールド名にスペースや無効な文字が含まれていないこと、またはインタープリターを混乱させる可能性がある標準属性(サイズや形状など)の名前に対応していないことを確認してください。

  1. deletechars

    名前から削除する必要があるすべての文字を組み合わせた文字列を提供します。デフォルトでは、無効な文字は~!@#$%^&*()-=+~\|]}[{';: /?.>,<.です

  2. excludelist

    _return, file, print…_など、除外する名前のリストを指定します。入力名の1つがこのリストの一部である場合、アンダースコア文字( '_')が追加されます。

  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
zeeshan khan

1つの行の列が多すぎます。例えば

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

列名を含むヘッダーには、データ自体より1列多いようです(ヘッダーの1435列とデータの1434列)。

次のいずれかを実行できます。

1)データでは意味をなさない1列をヘッダーから削除する

OR

2)genfromtxt()のスキップヘッダーを使用します。たとえば、np.genfromtxt('myfile', skip_header=*how many lines to skip*, delimiter=' ')documentation に詳細情報があります。

1
tadf2

このエラーが発生しました。原因は、スペースのある私のデータの単一のエントリでした。これにより、追加の行として表示されていました。すべてのデータですべての間隔が一貫していることを確認してください。

1
Jonathon D

私の場合、行に特殊記号があるためにエラーが発生しました。

エラーの原因:次のような特殊文字がある

  • 「#」ハッシュ
  • '、'あなたの(delimiter = '、')という事実を考えると

Csvファイルの例

  • 1、hello、#this、失敗
  • 1、hello、'、this'、失敗

    - - -コード - - -

    numpyをnumpyデータとしてインポートする= numpy.genfromtxt(file、delimiter = delimeter)#Error

環境メモ:

[〜#〜] os [〜#〜]:Ubuntu

csvエディター:LibreOffice

[〜#〜] ide [〜#〜]:Pycharm

1
hemant c

また、genfromtextを使用してテキストデータセットをロードし、Kerasを使用してテキスト分類を実行しようとしたときにも、このエラーが発生しました。

データ形式は次のとおりです:[some_text]\t[class_label]。私の理解では、第1列にパーサーを混乱させるいくつかの文字があり、2つの列を適切に分割できないということでした。

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

このスニペットはあなたと同じValueErrorを作成し、私の最初の回避策はすべてを1つの列として読み取ることでした:

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は、comments = '#'を想定しています。コメントマーカーは行のどこにでも置くことができます。 コメントマーカーの後にある文字はすべて無視されます

コメントを示すデフォルトの文字は「#」であるため、この文字がテキスト列に含まれている場合、その後のすべては無視されます。これが、2つの列をgenfromtextで認識できない理由です。

0
KLaz