1

numpy の genfromtxt を使用して、ヘッダー名と不均一なデータ型を使用してデータをインポートしようとしています。プログラムを実行するたびに、次のエラーが表示されます。

Traceback (most recent call last):
    raise ValueError(errmsg)
ValueError: Some errors were detected !
    Line #8 (got 6 columns instead of 1)
    Line #9 (got 6 columns instead of 1)
    Line #10 (got 6 columns instead of 1)
    Line #11 (got 6 columns instead of 1)
    Line #12 (got 6 columns instead of 1)

私はすでにこの質問を しましたが、私の問題は解決しませんでした。非常に単純な問題ですが、何が間違っているのかわかりません。コードとデータが含まれています。

コード

import numpy as np
data = np.genfromtxt('Data.dat', comments='#', delimiter='\t', names=True, dtype=None).transpose()
print data

タブ区切りデータ

# -----
# -----
# -----
# -----
# -----
# -----
# -----
column_1    column_2    column_3    column_4    column_5    column_6
1   2   3   A   1   F
4   3   2   B   2   G
1   4   3   C   3   H
5   6   4   D   4   I

アップデート

要するに、私が必要としているのは、skip_header の後の最初の有効な行を、オプションの引数 names=True を持つ最初のコメント解除された有効な行に変換する方法です。

4

3 に答える 3

2

の場合names=True、その行がコメントであっても、最初の行 (行の後) にフィールド名が含まれているとgenfromtxt想定されます。どうやら、フィールド名がコメントで指定されるのはかなり一般的です。コメント化されていないフィールド名の前に可変数のコメントがある場合は、この の癖を回避する必要があります。以下は、これを行う 1 つの方法を示しています。skip_headergenfromtxt

これが私のテストファイルです。(ファイルはスペース区切りです。タブ区切りファイルdelimiter='\t'の呼び出しに追加します)。genfromtxt

In [12]: cat with_comments.dat
# Some
# comments
# here
foo bar baz
1.0 2.0 3.0
4.0 5.0 6.0
7.0 8.0 9.0

ファイルを開き、行がコメントでなくなるまで行を読み取ります。

In [13]: f = open("with_comments.dat", "r")

In [14]: line = f.readline()

In [15]: while line.startswith('#'):
   ....:     line = f.readline()
   ....: 

lineフィールド名の行を保持するようになりました:

In [16]: line
Out[16]: 'foo bar baz\n'

それを名前のリストに変換します。

In [17]: names = line.split()

これらの名前を genfromtxt に与え、残りのファイルを読み取ります。

In [18]: data = genfromtxt(f, names=names)

In [19]: data
Out[19]: 
array([(1.0, 2.0, 3.0), (4.0, 5.0, 6.0), (7.0, 8.0, 9.0)], 
      dtype=[('foo', '<f8'), ('bar', '<f8'), ('baz', '<f8')])

ファイルを閉じることを忘れないでください(または、with("with_comments.dat", "r") as f:代わりに使用することをお勧めします):

In [20]: f.close()
于 2015-03-02T17:25:27.350 に答える
0

わかりました、少し突っ込んで答えが明らかになりました。genfromtxt()ドキュメントから( http://docs.scipy.org/doc/numpy/user/basics.io.genfromtxt.html ):

注: この動作には注目すべき例外が 1 つあります。オプションの引数 names=True の場合、最初のコメント行で名前が調べられます。

したがって、コードを機能させるには、データを次の形式にする必要があります。

#column_1   column_2    column_3    column_4    column_5    column_6
#   -----
#   -----
#   -----
#   -----
#   -----
#   -----
1   2   3   A   1   F
4   3   2   B   2   G
1   4   3   C   3   H
5   6   4   D   4   I

または、可変数のヘッダー/コメント行があり、列がすべて同じである場合は、genfromtxt引数で列名を定義できます。

data = np.genfromtxt(
    path, comments='#', delimiter='\t', 
    names='column_1,column_2,column_3,column_4,column_5,column_6',
    dtype=None
)

ただし、commentsキーワードを使用するgenfromtxtと、列ヘッダーを構成する最後のコメント行の後の最初の行が読み取られます。それはデータの一部であると想定されるため、dtype は文字列である必要があるため、この段階でのデータは次のようになります。

array([('column_1', 'column_2', 'column_3', 'column_4', 'column_5', 'column_6'),
       ('1', '2', '3', 'A', '1', 'F'), ('4', '3', '2', 'B', '2', 'G'),
       ('1', '4', '3', 'C', '3', 'H'), ('5', '6', '4', 'D', '4', 'I')], 
      dtype=[('column_1', 'S8'), ('column_2', 'S8'), ('column_3', 'S8'), ('column_4', 'S8'), ('column_5', 'S8'), ('column_6', 'S8')])

列のデータ型がわかっている場合は、まず最初の行を除いてスライスを取得します。

data1 = data[1:]

次に、次を変更しdtypesます。

data1.astype(np.dtype([('column_1', 'i4'),('column_2', 'i4'), ('column_3', 'i4'), ('column_4', 'S10'), ('column_5', 'i4'), ('column_6', 'S10')]))

出力:

array([(1, 2, 3, 'A', 1, 'F'), (4, 3, 2, 'B', 2, 'G'),
       (1, 4, 3, 'C', 3, 'H'), (5, 6, 4, 'D', 4, 'I')], 
      dtype=[('column_1', '<i4'), ('column_2', '<i4'), ('column_3', '<i4'), ('column_4', 'S10'), ('column_5', '<i4'), ('column_6', 'S10')])
于 2015-03-02T14:14:55.743 に答える
0

のドキュメントによるとgenfromtxt

が True の場合names、フィールド名は最初の行の後の最初の有効な行から読み取られますskip_header

あなたの例では、呼び出しに追加skip_header=7して機能させることができます。genfromtxt

于 2015-03-02T14:18:08.227 に答える