3

私の教授は IDL を使用して、私が最終的に読み取って操作できるようにする必要がある ASCII データのファイルを送ってきました。

彼は次のコマンドを使用してデータを読み取りました。

readcol, 'sn-full.txt', format='A,X,X,X,X,X,F,A,F,A,X,X,X,X,X,X,X,X,X,A,X,X,X,X,A,X,X,X,X,F,X,I,X,F,F,X,X,F,X,F,F,F,F,F,F', $
sn, off1, dir1, off2, dir2, type, gal, dist, htype, d1, d2, pa, ai, b, berr, b0, k, kerr

これは、最初の 2 行がどのように見えるかの写真です: http://i.imgur.com/hT7YIE3.png

私は天文学者になるつもりはないので Python を使っていますが、初心者なのでデータを読むのに苦労しています。

彼のコードでは、データ型 A (文字列データ) を列 1 に割り当て、X を使用して列 2 から 6 をスキップし、データ型 F (浮動小数点) を列 7 に割り当てます。次に、sn が割り当てられます。スキップされていない最初の列などに。

numpy.loadtxt("sn-full.txt")またはを使用してこれを複製しようとしましascii.read("sn-full.txt")たが、dtype パラメータの入力方法がわかりません。すべてを特定のデータ型に割り当てることができることはわかっていますが、個々の列にデータ型を割り当てるにはどうすればよいでしょうか?

4

3 に答える 3

2

http://casa.colorado.edu/~ginsbura/pyreadcol.htmは、あなたが望むように見えます。IDL の readcol 関数をエミュレートします。

別の可能性はhttps://pypi.python.org/pypi/fortranformatです。それはより有能であるように見え、あなたが見ているデータは固定フォーマットであり、フォーマット指定子 (X、A など) は fortran フォーマット指定子です。

于 2013-10-22T22:38:06.197 に答える
0

その特定の目的のためにPandasを使用します。これを行う最も簡単な方法は、列が単一のタブで区切られていると仮定することです。

import pandas as pd
import scipy as sp   # Provides all functionality from numpy, too
mydata = pd.read_table(
             'filename.dat', sep='\t', header=None, 
             names=['sn', 'gal_name1', 'gal_name2', 'year', 'month',...],
             dtype={'sn':sp.float64, 'gal_name1':object, 'year':sp.int64, ...},)

(ここでの文字列は、一般的な「オブジェクト」データ型に分類されます)。

各列には名前が付けられ、 としてアクセスできるようmydata['colname']になりました。これは、通常の numpy 1D 配列のようにスライスできますmydata['colname'][20:50]

mydata['column'].plot()Pandas には matplotlib へのプロット呼び出しが組み込まれているため、数値型の列の概要を、または のように 2 つの異なる列を相互に比較してすばやく取得できますmydata.plot('col1', 'col2')。すべての通常のプロット キーワードを渡すことができます。

通常の matplotlib ルーチンでデータをプロットする場合は、列を matplotlib に渡すだけで、通常の Numpy ベクトルとして扱われます。各列は、通常の Numpy ベクトルとしてアクセスできますmydata['colname'].values

編集

データが均一に分離されていない場合は、numpy のgenfromtxt()機能の方が優れています。その後、次の方法で Pandas DataFrame に変換できます。

mydf = pd.DataFrame(myarray, columns=['col1', 'col2', ...],
                    dtype={'col1':sp.float64, 'col2':object, ...})
于 2013-10-23T17:22:19.307 に答える