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のマトリックスに必要に応じてデータをロードしました。
load
は通常、octaveおよびmatlabバイナリファイルをロードするためのものですが、あなたのようなテキストデータをロードするために使用することもできます。 "-ascii"
オプションを使用してデータをロードできますが、"-ascii"
オプションが有効になっている場合でも、ファイルをload
に入れる前にファイルを少し再フォーマットする必要があります。一貫性のある列区切り文字を使用します。タブまたはカンマのみ。3850.
ではなく完全な数値を使用し、文字列は使用しないでください。
次に、このようなことを実行して機能させることができます
DATA = load("-ascii", "auto.txt");
最後の文字列フィールドが各行から削除された場合、ファイルは次のように読み取ることができます。
_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)
_