web-dev-qa-db-ja.com

numpy.genfromtxtは、2D配列ではなく、タプルのような配列を生成します。なぜですか?

以下のように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.txtthis Gist からのものです。

結果を見ると、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)
34
robintw

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

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

最初の2つの列のコンバーターを削除するときに2D配列を返す理由は、その場合、genfromtxtは同じ型のすべてのデータを考慮し、通常のndarrayが返されるためです(デフォルトの型は浮動小数点ですが、これを指定できます) dtype引数を使用)。

[〜#〜] edit [〜#〜]:列名を利用する場合は、names引数を使用して(および_skip_header_は3つだけ):

_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')
_
46
joris