7

私は nympy を初めて使用し、次のコードを使用して、タブ (\t) で区切られたテキスト ファイルを numpy 配列マトリックスに読み込もうとしています。

train_data = np.genfromtxt('training.txt', dtype=None, delimiter='\t')

ファイルの内容:

38   Private    215646   HS-grad    9    Divorced    Handlers-cleaners   Not-in-family   White   Male   0   0   40   United-States   <=50K
53   Private    234721   11th   7    Married-civ-spouse  Handlers-cleaners   Husband     Black   Male   0   0   40   United-States   <=50K
30   State-gov  141297   Bachelors  13   Married-civ-spouse  Prof-specialty  Husband     Asian-Pac-Islander  Male   0   0   40   India   >50K

私が期待するのは、形状 (3, 15) の 2 次元配列行列です。

しかし、上記のコードでは、形状 (3,) の単一行配列しか得られません

各行の 15 個のフィールドにそれぞれ列が割り当てられていない理由がわかりません。

numpy の loadtxt() も使用してみましたが、データの型変換を処理できませんでした。つまり、dtype=None を指定しても、文字列をデフォルトの float 型に変換しようとして失敗しました。

試したコード:

train_data = np.loadtxt('try.txt', dtype=None, delimiter='\t')

Error:
ValueError: could not convert string to float: State-gov

ポインタはありますか?

ありがとう

4

3 に答える 3

4

実際、ここでの問題は、dtype が構造化されている場合 (つまり、複数の型がある場合)np.genfromtxtと両方が構造化配列np.loadtxtを返すことです。技術的には「レコード」の1次元配列であるため、配列は の形状を報告します。これらの「レコード」はすべての列を保持しますが、2D であるかのようにすべてのデータにアクセスできます。(3,)

あなたはそれを正しくロードしています:

In [82]: d = np.genfromtxt('tmp',dtype=None)

あなたが報告したように、それは1次元の形をしています:

In [83]: d.shape
Out[83]: (3,)

しかし、すべてのデータはそこにあります:

In [84]: d
Out[84]: 
array([ (38, 'Private', 215646, 'HS-grad', 9, 'Divorced', 'Handlers-cleaners', 'Not-in-family', 'White', 'Male', 0, 0, 40, 'United-States', '<=50K'),
       (53, 'Private', 234721, '11th', 7, 'Married-civ-spouse', 'Handlers-cleaners', 'Husband', 'Black', 'Male', 0, 0, 40, 'United-States', '<=50K'),
       (30, 'State-gov', 141297, 'Bachelors', 13, 'Married-civ-spouse', 'Prof-specialty', 'Husband', 'Asian-Pac-Islander', 'Male', 0, 0, 40, 'India', '>50K')], 
      dtype=[('f0', '<i8'), ('f1', 'S9'), ('f2', '<i8'), ('f3', 'S9'), ('f4', '<i8'), ('f5', 'S18'), ('f6', 'S17'), ('f7', 'S13'), ('f8', 'S18'), ('f9', 'S4'), ('f10', '<i8'), ('f11', '<i8'), ('f12', '<i8'), ('f13', 'S13'), ('f14', 'S5')])

dtype配列の構造は次のとおりです。

In [85]: d.dtype
Out[85]: dtype([('f0', '<i8'), ('f1', 'S9'), ('f2', '<i8'), ('f3', 'S9'), ('f4', '<i8'), ('f5', 'S18'), ('f6', 'S17'), ('f7', 'S13'), ('f8', 'S18'), ('f9', 'S4'), ('f10', '<i8'), ('f11', '<i8'), ('f12', '<i8'), ('f13', 'S13'), ('f14', 'S5')])

また、dtype で指定された名前を使用して、 「列」( fieldsと呼ばれる) に引き続きアクセスできます。

In [86]: d['f0']
Out[86]: array([38, 53, 30])

In [87]: d['f1']
Out[87]: 
array(['Private', 'Private', 'State-gov'], 
      dtype='|S9')

フィールドに適切な名前を付ける方が便利です。

In [104]: names = "age,military,id,edu,a,marital,job,fam,ethnicity,gender,b,c,d,country,income"

In [105]: d = np.genfromtxt('tmp',dtype=None, names=names)

'age'フィールドなどにアクセスできるようになりました。

In [106]: d['age']
Out[106]: array([38, 53, 30])

In [107]: d['income']
Out[107]: 
array(['<=50K', '<=50K', '>50K'], 
      dtype='|S5')

または35歳未満の人の収入

In [108]: d[d['age'] < 35]['income']
Out[108]: 
array(['>50K'], 
      dtype='|S5')

35歳以上

In [109]: d[d['age'] > 35]['income']
Out[109]: 
array(['<=50K', '<=50K'], 
      dtype='|S5')
于 2013-10-07T20:52:33.873 に答える
2

更新された回答

申し訳ありませんが、元の質問を読み違えました:

私が期待するのは、形状 (3, 15) の 2 次元配列マトリックスです。

しかし、上記のコードでは、形状 (3,) の単一行配列しか得られません

何が返されるかを誤解していると思いますnp.genfromtxt()。この場合、テキスト ファイル内の各「列」のタイプを推測し、構造化された「レコード」配列を返します。各行には複数のフィールド ( f0...f14) が含まれ、各フィールドには、テキスト ファイルの「列」に対応する異なるタイプの値を含めることができます。特定のフィールドを名前で索引付けできますdata['f0']

異種の型の派手な配列を持つことはできません。たとえば、次のように、文字列の同種の配列を使用でき(3,15)ます。(3,15)

>>> string_data = np.genfromtext('test', dtype=str, delimiter='\t')
>>> print string_data.shape
(3, 15)

もちろん、@ DrRobotNinjaの回答のように、列を任意のタイプに手動でキャストできます。ただし、numpy に構造化配列を作成させてから、フィールドごとにインデックスを付けて、列を新しい配列に割り当てることもできます。

于 2013-10-07T10:51:11.243 に答える