web-dev-qa-db-ja.com

Octaveで特定の形式のテキストデータをロードする

Octaveに保存してロードできるデータセットがあります

18.0   8   307.0      130.0      3504.      12.0   70  1    "chevrolet chevelle malibu"
15.0   8   350.0      165.0      3693.      11.5   70  1    "buick skylark 320"
18.0   8   318.0      150.0      3436.      11.0   70  1    "plymouth satellite"
16.0   8   304.0      150.0      3433.      12.0   70  1    "amc rebel sst"
17.0   8   302.0      140.0      3449.      10.5   70  1    "ford torino"
15.0   8   429.0      198.0      4341.      10.0   70  1    "ford galaxie 500"
14.0   8   454.0      220.0      4354.       9.0   70  1    "chevrolet impala"
14.0   8   440.0      215.0      4312.       8.5   70  1    "plymouth fury iii"
14.0   8   455.0      225.0      4425.      10.0   70  1    "pontiac catalina"
15.0   8   390.0      190.0      3850.       8.5   70  1    "amc ambassador dpl"

使用しようとするとすぐに機能しません:

data = load('auto.txt')

指定された形式のテキストファイルからロードする方法はありますか、それともたとえばに変換する必要がありますか?

18.0,8,307.0,130.0,3504.0,12.0,70,1
...

EDIT:最後の行を削除し、「半分」の数値を修正します。例: 3504。-> 3504.0そして使用:

data = load('-ascii','autocleaned.txt');

Octaveのマトリックスに必要に応じてデータをロードしました。

5
user317706

loadは通常、octaveおよびmatlabバイナリファイルをロードするためのものですが、あなたのようなテキストデータをロードするために使用することもできます。 "-ascii"オプションを使用してデータをロードできますが、"-ascii"オプションが有効になっている場合でも、ファイルをloadに入れる前にファイルを少し再フォーマットする必要があります。一貫性のある列区切り文字を使用します。タブまたはカンマのみ。3850.ではなく完全な数値を使用し、文字列は使用しないでください。

次に、このようなことを実行して機能させることができます

DATA = load("-ascii", "auto.txt");
5
ShaneQful

最後の文字列フィールドが各行から削除された場合、ファイルは次のように読み取ることができます。

_filename='stack25148040_1.txt'
fid = fopen(filename, 'r');
[x, count] = fscanf(fid, '%f', [10, Inf])
endif
fclose(fid);
_

または、ファイル全体を1つの列として読み込んで、形状を変更することもできます。

数値フィールドと文字列フィールドの両方を読み取る方法がわかりません。そのためには、より汎用的なファイル読み取りツールを使用してPythonに頼る必要がありました。

これは、ファイルを読み取り、numpy構造化配列を作成し、それを_.mat_ファイルに書き込むPythonスクリプトです。これにより、Octaveが実行できます。読んだ:

_import csv
import numpy as np

data=[]
with open('stack25148040.txt','rb') as f:
    r = csv.reader(f, delimiter=' ')
    # csv handles quoted strings with white space
    for l in r:
        # remove empty strings from the split on ' '
        data.append([x for x in l if x])
print data[0]
for dd in data:
    # convert 8 of the strings (per line) to float
    dd[:]=[float(d) for d in dd[:8]]+dd[-1:]

data=data[:-1]  # remove empty last line
print data[0]
print
# make a structured array, with numbers and a string
dt=np.dtype("f8,i4,f8,f8,f8,f8,i4,i4,|S25")
A=np.array([Tuple(d) for d in data],dtype=dt)
print A
from scipy.io import savemat
savemat('stack25148040.mat',{'A':A})
_

Octaveでは、これは

_load stack25148040.mat
A
# A = 1x10 struct array containing the fields:
#    f0 f1 ... f8

A.f8  # string field
A(1)  # 1st row
#  scalar structure containing the fields:
#   f0 =  18
#   f1 = 8
...
#   f8 = chevrolet chevelle malibu
_

新しいオクターブ(3.8)にはimportdata関数があります。追加の引数なしで元のデータファイルを処理します。 2つのフィールドを持つ構造を返します

_x.data_は_(10,11)_行列です。 x.data(:,1:8)は欲望の数値データです。 x.data(:,9:11)は、NAと乱数を組み合わせたものです。 NAは、行末の単語の代わりになります。 _x.textdata_は、これらの単語を含む_(24,1)_セルです。引用符で囲まれた文字列は、NAと引用符を使用してこれらの単語から再構成し、どの行に属する単語の数を決定できます。

数値データを読み取るには、dlmreadを使用します。 importdataの残りの部分はOctaveで記述されているため、文字列データを適切に処理するカスタム関数の開始点として使用できます。

_dlmread ('stack25148040.txt')(:,1:8)
importread ('stack25148040.txt').data(:,1:8)
textread ('stack25148040.txt','')(:,1:8)
_
5
hpaulj

https://octave.org/doc/v4.0.0/Simple-File-I_002fO.html

これを試して、

data = importdata('Auto.data')
0