web-dev-qa-db-ja.com

CSVファイルをnumpy配列に読み込み、最初の行を文字列として、残りをフロートとして

最初の行が文字列(列名)で、残りの行が数字であるCSVにデータが保存されています。これをnumpy配列に保存するにはどうすればよいですか?私が見つけることができるのは、列ではなく行ではなくデータ型を設定する方法です。

現在、計算を行うためにヘッダーをスキップしていますが、最終バージョンにはヘッダーが必要です。ただし、ヘッダーをそのままにすると、配列全体が文字列として設定され、計算が失敗します。

これは私が持っているものです:

 data = np.genfromtxt(path_to_csv, dtype=None, delimiter=',', skip_header=1) 
26
postelrich

関数names=Truenp.genfromtxt引数を使用すると、列名を保持できます

 data = np.genfromtxt(path_to_csv, dtype=float, delimiter=',', names=True) 

データをフロートに変換するdtype=floatに注意してください。これは、dtype=Noneを使用してデータ型を推測するnp.genfromtxtを使用するよりも効率的です。

出力は構造化配列になり、名前で個々の列にアクセスできます。名前は最初の行から取得されます。いくつかの変更が発生する場合があります。たとえば、列名のスペースは_に変更されます。 documentation は、あなたが持つことができるほとんどの質問をカバーするはずです。

40
Pierre GM

最終バージョンでヘッダーが必要だと言ったときの意味がわかりませんが、次のような文字列で列にアクセスする構造化配列を生成できます。

data = np.genfromtxt(path_to_csv, dtype=None, delimiter=',', names=True)

そして、data['col1_name']data['col2_name']などで列にアクセスします。

12
user545424

Numpy配列の全体的な考え方は、すべての要素が同じ型であるということです。ヘッダーをPythonリストに読み込み、数値とは別に管理します。構造化配列(レコードの配列)を作成することもできます。この場合、ヘッダーを使用してフィールドに名前を付けることができますその場合、レコードを配列に格納することは冗長になります。

2
kindall