web-dev-qa-db-ja.com

numpy.loadtxtを使用して、フロートと文字列の両方を含むテキストファイルをロードする

次を含むテキストファイル_data.txt_があります。

_5.1,3.5,1.4,0.2,Iris-setosa
4.9,3.0,1.4,0.2,Iris-setosa
5.8,2.7,4.1,1.0,Iris-versicolor
6.2,2.2,4.5,1.5,Iris-versicolor
6.4,3.1,5.5,1.8,Iris-virginica
6.0,3.0,4.8,1.8,Iris-virginica
_

_[['5.1' '3.5' '1.4' '0.2' 'Iris-setosa'] ['4.9' '3.0' '1.4' '0.2' 'Iris-setosa'] ...]_などのロード後にNumPy配列を取得できるように、numpy.loadtxt()を使用してこのデータをロードするにはどうすればよいですか?

私は試した

_np.loadtxt(open("data.txt"), 'r',
           dtype={
               'names': (
                   'sepal length', 'sepal width', 'petal length',
                   'petal width', 'label'),
               'formats': (
                   np.float, np.float, np.float, np.float, np.str)},
           delimiter= ',', skiprows=0)
_
23
VeilEclipse

np.genfromtxt を使用すると、genfromtxtに各列のdtypeをインテリジェントに推測するように指示する_dtype=None_を指定できます。最も便利なのは、文字列列に必要なバイト数を指定する手間が省けることです。 (たとえば、_np.str_を指定してバイト数を省略しても機能しません。)

_In [58]: np.genfromtxt('data.txt', delimiter=',', dtype=None, names=('sepal length', 'sepal width', 'petal length', 'petal width', 'label'))
Out[58]: 
array([(5.1, 3.5, 1.4, 0.2, 'Iris-setosa'),
       (4.9, 3.0, 1.4, 0.2, 'Iris-setosa'),
       (5.8, 2.7, 4.1, 1.0, 'Iris-versicolor'),
       (6.2, 2.2, 4.5, 1.5, 'Iris-versicolor'),
       (6.4, 3.1, 5.5, 1.8, 'Iris-virginica'),
       (6.0, 3.0, 4.8, 1.8, 'Iris-virginica')], 
      dtype=[('sepal_length', '<f8'), ('sepal_width', '<f8'), ('petal_length', '<f8'), ('petal_width', '<f8'), ('label', 'S15')])
_

_np.loadtxt_を使用する場合、最小限の変更でコードを修正するには、次を使用できます。

_np.loadtxt("data.txt",
   dtype={'names': ('sepal length', 'sepal width', 'petal length', 'petal width', 'label'),
          'formats': (np.float, np.float, np.float, np.float, '|S15')},
   delimiter=',', skiprows=0)
_

主な違いは、単に_np.str_を_|S15_(15バイトの文字列)に変更することです。

また、open("data.txt"), 'r'open("data.txt", 'r')でなければなりません。ただし、_np.loadtxt_はファイル名を受け入れることができるため、openを使用する必要はまったくありません。

38
unutbu

数字とテキストを一緒に保持することはあなたに多くの問題を引き起こしているようです-あなたがそれらを分けることに決めた場合、私の回避策は次のとおりです:

values = np.loadtxt('data', delimiter=',', usecols=[0,1,2,3])
labels = np.loadtxt('data', delimiter=',', usecols=[4])
18
mauve