1

次の形式のデータがあります。

#---------------------
# Data
#---------------------
p   q   r   y 1 y 2 y 3 y 4
2   8   14  748 748 748 790
2   9   22  262 245 252 328
1   5   19  512 514 511 569
2   7   19  748 748 748 805
3   11  13  160 168 108 164
2   7   20  788 788 788 848
1   4   15  310 310 310 355
3   12  17  230 210 213 218

そして、次のコードを使用して、np.genfromtxt() を使用して配列 B を生成しようとしています。

import numpy as np
A = open('data.dat', "r")
line = A.readline()
while line.startswith('#'):
    line = A.readline()
A_header = line.split("\t")
A_header[-1] = A_header[-1].strip()
B = np.genfromtxt('data.dat', comments='#', delimiter='\t', names = A_header, dtype = None, unpack = True).transpose()
print B
print B['y_1']

2 つの質問があります。

  1. インポート中に np.genfromtxt() がデータヘッダーを削除しないのはなぜですか? データがインポートされると、配列 B にはまだヘッダー p、q、... y 3、y 4 があります。

  2. ヘッダー名 (y_1、y_2 など) にアンダースコアを付ける必要があるのはなぜですか? y 1、y 2 ... y 4 のように名前を付けられないのはなぜですか?

4

3 に答える 3

3

ファイルを 2 回開く代わりに、次のようにします。

import numpy as np

with open('input.txt', "r") as data:
    while True:
        line = data.readline()
        if not line.startswith('#'): break

    header = [e for e in line.strip().split('\t') if e]
    print(header)

    B = np.genfromtxt(data, names=header, dtype=None, delimiter='\t')

print B
print B['y_1']

出力:

# header
['p', 'q', 'r', 'y 1', 'y 2', 'y 3', 'y 4']

# B
[(2, 8, 14, 748, 748, 748, 790) (2, 9, 22, 262, 245, 252, 328)
 (1, 5, 19, 512, 514, 511, 569) (2, 7, 19, 748, 748, 748, 805)
 (3, 11, 13, 160, 168, 108, 164) (2, 7, 20, 788, 788, 788, 848)
 (1, 4, 15, 310, 310, 310, 355) (3, 12, 17, 230, 210, 213, 218)]

# B['y_1']
[748 262 512 748 160 788 310 230]

np.genfromtxtここでは、ファイル名を に渡す代わりにdata、ファイル リーダー ジェネレーターを渡します。

skip_headerそうしないと、コメント行が考慮されるため、実際には機能しないという奇妙な状況に陥ります。したがってskip_header=4、何が作るのかがskip_header=1.

したがって、このアプローチは最初にコメント行を「破棄」します。次に、次の行でヘッダーを抽出します。np.genfromtxt残りの行は、関連するヘッダーとともに関数に渡されます。

いくつかのメモ:

  • unpack=True+transpose()お互いをキャンセルします。したがって、両方を使用した場合の効果は、どちらも使用しない場合と同じです。したがって、どちらも使用しないでください。

  • また、(アンダースコアの代わりに) スペースを含む名前を使用してフィールドにアクセスしたい場合は、生成後にいつでもフィールドの名前を変更できますndarray

    B.dtype.names = [n.replace('_', ' ') for n in B.dtype.names]
    print B['y 1']  # [748 262 512 748 160 788 310 230]
    
于 2015-04-04T20:55:16.780 に答える
0

価値があるのは、pandas.read_tableこのファイルを簡単に読み取ることです。

import pandas
B = pandas.read_table('data.dat', comment='#')

print B['y 1']  # Note the space is retained in the column name
于 2015-04-07T05:05:55.167 に答える