39

私はgenfromtxt以下のように走っています:

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})

この要点input.txtはどこにありますか。

結果を見ると、2D 配列ではなく 1D 配列です。

>>> 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)

呼び出しからコンバーターの仕様を削除すると、正常にgenfromtxt動作し、2D 配列が生成されます。

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

1 に答える 1

52

返されるものは、構造化された ndarrayと呼ばれます。たとえば、http: //docs.scipy.org/doc/numpy/user/basics.rec.htmlを参照してください。これは、データが均一でないためです。つまり、すべての要素が同じ型であるとは限らないためです。データには文字列 (最初の 2 列) と浮動小数点数の両方が含まれています。Numpy 配列は同種でなければなりません (説明については、こちらを参照してください)。

構造化配列は、レコードまたは行ごとにタプルを使用することで、この均一性の制約を「解決」します。これが、返される配列が 1D である理由です。タプルの 1 つのシリーズですが、各タプル (行) は複数のフィールドで構成されているため、次のように見なすことができます。行と列。a['nameofcolumn']たとえば、さまざまな列にアクセスできますa['Julian_Day']

最初の 2 列のコンバーターを削除するときに 2D 配列を返す理由は、その場合、genfromtxt同じ型のすべてのデータを考慮し、通常の ndarray が返されるためです (既定の型は float ですが、これを次のように指定できます)。dtype引数) 。

EDIT:列名を利用したい場合は、names引数を使用できます(そしてskip_header3つだけに設定します):

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')
于 2012-03-02T14:10:52.200 に答える