粗大メモ置き場

個人用,たまーに来訪者を意識する雑記メモ

MATLABでnumpyで保存したcsvファイルを開く

結論

書きはじめの時は,numpyで保存したcsvmatlabに変な感じで認識されるのを不満に思っていたのですが,途中から自分の過ちに気づきました.

要点は以下の2つです.

  • csvread()は区切りがカンマでなくては行けない
  • そうでない場合はreadtable()を使う

はい.帰ってよし.

numpy arrayの保存

自分はもっぱらsavetxtを用います.

numpy.savetxt("K.csv", K, delimiter =',',fmt="%0.14f")

loadする時,そのままnumpy arrayとしてloadでき,他のソフトからも開きやすいからです.(Excelはダメ)

こんなデータになる

糞長くなるので人間にわかりやすいデータではないですが,一応こんな感じにsaveされます. 嘘です.delimiter =','という引数を加えないと区切りがスペースになってしまいます. 其の結果が以下の通りです.

1.554141360341085672e+09 8.172370370370369983e+02 4.427456790123457040e+02 -1.855009145168301770e-03 -4.460917310385187178e-03
1.554141360408607960e+09 8.172024691358025166e+02 4.427777777777777715e+02 -1.670469061790032239e-03 -4.653048558273605202e-03
1.554141360473935604e+09 8.172383292383292428e+02 4.427518427518427302e+02 -1.816789199264026364e-03 -4.465982169869531920e-03
1.554141360534764767e+09 8.171901234567901611e+02 4.427753086419753004e+02 -1.689939994465252445e-03 -4.698456650358831185e-03

MATLABcsvを開く

最も直感的なのはドラッグアンドドロップしてuiopenとして開くことです. 直感的だけど多くのcsvを読む用途には適しません.

csvread:’,’をdelimiterにしないとおかしくなる.

一応,csvread(filename)とする手法がありますが,先ほどのcsvを読むと4行5列のarrayのはずなのに4行1列として表示されます.

ans =

   1.0e+09 *

    1.5541
    0.0000
    0.0000
   -0.0000

カンマで区切ってないからですね.

readtable:有能

readtableなら区切り文字がほかの文字でもうまく検出することができます. 一方で返り値はtableなのでtable2array()関数で変換する必要があります.

table2array(readtable(flename))

という感じです.

Reference

みんなもちゃんとリファレンス読みましょう.

How can I import data from .csv file with numeric values and texts (with column headers) into MATLAB Workspace? - MATLAB Answers - MATLAB Central

テキスト ファイルのインポート - MATLAB & Simulink - MathWorks 日本