2012-03-02 2 views
28

私は以下のようなgenfromtxtを実行している:numpy.genfromtxtは、2次元配列ではないタプルのようなものの配列を生成します - なぜですか?

input.txtthis gistからである
date_conv = lambda x: str(x).replace(":", "/") 
time_conv = lambda x: str(x) 

a = np.genfromtxt(input.txt, delimiter=',', skip_header=4, 
     usecols=[0, 1] + radii_indices, converters={0: date_conv, 1: time_conv}) 

Iは結果を見ると、それが1次元配列でない2次元配列である:

>>> np.shape(a) 
(918,) 

ではなくタプルの配列であると思われる:

>>> a[0] 
('06/03/2006', '08:27:23', 6.4e-05, 0.000336, 0.001168, 0.002716, 0.004274, 0.004658, 0.003756, 0.002697, 0.002257, 0.002566, 0.003522, 0.004471, 0.00492, 0.005602, 0.006956, 0.008442, 0.008784, 0.006976, 0.003917, 0.001494, 0.000379, 6.4e-05) 

Iはコンバータを削除する場合genfromtxtからの仕様では、正常に動作し、2D配列が生成されます。

答えて

38

構造化ndarrayと呼ばれます。例:http://docs.scipy.org/doc/numpy/user/basics.rec.htmlを参照してください。これは、データが均質でない、つまりすべての要素が同じタイプであるわけではないためです。データには文字列(最初の2つの列)と浮動小数点の両方が含まれています。ナンシーアレイは均質でなければならない(説明についてはhereを参照)。

構造化配列は、レコードまたは行ごとにタプルを使用することで、この同質性の制約を解決します。その理由は、返される配列が1Dである理由です。タプルは1系列ですが、各タプル(行)それを行と列とみなすことができます。異なる列にはa['nameofcolumn']と入力できます(例:a['Julian_Day'])。

最初の2つの列のコンバーターを削除するときに2D配列を返す理由は、同じタイプのすべてのデータをgenfromtxtがすべて受け取り、通常のndarrayが返されるためです(デフォルトの型はfloatですが、これはdtype引数で指定できます)。

EDIT:あなたは列名を利用したい場合は、(3つだけでskip_headerをして設定)names引数を使用することができます。

a2 = np.genfromtxt("input.txt", delimiter=',', skip_header=3, names = True, dtype = None, 
        usecols=[0, 1] + radii_indices, converters={0: date_conv, 1: time_conv}) 

あなたは、例えば行うことができます。

>>> a2['Dateddmmyyyy'] 
array(['06/03/2006', '06/03/2006', '18/03/2006', '19/03/2006', 
     '19/03/2006', '19/03/2006', '19/03/2006', '19/03/2006', 
     '19/03/2006', '19/03/2006'], 
     dtype='|S10') 
関連する問題