MATLAB に慣れた人が Python を始めるときの11の注意点

シェアする

この記事では、MATLAB にある程度慣れている人の中で、これから Python をはじめる人を対象としています。両方ともプログラミング言語で似ているところもあるため、0 から Python をはじめるよりは MATLAB を経験していたほうがやりやすいです。ただ、MATLAB と Python とで違う点もあります。今回は重要な相違点をまとめました。

MATLAB は、数値計算・データ解析・機械学習を行うためのプログラミング言語の一つとして有名です。行列計算をしやすいように設計されているため、データ解析したり機械学習の手法を開発したりしやすいのです。Statistics and Machine Learning Toolbox などの多くのツールボックスが充実しており、機械学習の分野だけでなく信号処理・制御・経済・ロボットなどのいろいろな分野で活用されています。制御の分野では Simulink も便利ですね。MATLAB 利用者によっていろいろなプログラムが開発され公開されており、他の利用者も使えます。たとえばサポートベクターマシンでは LIBSVM が有名です。

このように MATLAB はたとえばデータ解析や機械学習をするのにとても便利なプログラミングで、わたしも利用していますが、MATLAB は有料です。いろいろな事情で MATLAB を購入できない人や、途中で購入できなくなってしまった人もいるかもしれません。

データ解析・機械学習を行うための、無料で利用できるプログラミング言語としては、RPython があります。両方利用している身としては、どちらかを始める人がいたら、金子研でも採用している Python を今はオススメしています。Python では、機械学習用のライブラリである scikit-learn が充実していることが大きいですね。

というわけで、MATLAB をやっていた人が、Python をはじめることを考えます。MATLAB のソフトウェアと似ている総合開発環境は Spyder です。Anaconda に Spyder が入っていますので、最初は Anaconda をインストールするのがよいでしょう。

for 文、if 文、関数などは、いろいろなウェブサイトに使い方がありますので、Google で検索して調べるのがよいと思います。それ以外に、MATLAB の経験がある人は、以下の点に注意すると効率的に Python を始められます。

  1. Python では順番が 0 から始まります
  2. 一次元配列 (ベクトル) や二次元配列 (行列) の要素を参照するには [] です
  3. 1×n や n×1 の行列と、大きさ n のベクトルとは異なります
  4. find したいときには numpy.where() です
  5. 指定した行や列を削除したいときには pandas.DataFrame.drop() を使いましょう
  6. 転置行列は numpy.array.T や pandas.DataFrame.T です
  7. 行列同士の掛け算には numpy.dot を使いましょう
  8. ゼロ行列は numpy.zeros() で作ります
  9. 0 から 1の間の一様乱数は numpy.random.rand() で、平均 0, 標準偏差 1 の正規分布の乱数は numpy.random.randn() で発生させましょう
  10. switch 文はないため、すべて if 文で書きましょう
  11. numpy, pandas, scipy, scikit-learn を使いこなしましょう

順に説明します。

1. Python では順番が 0 から始まります

2. 一次元配列 (ベクトル) や二次元配列 (行列) の要素を参照するには [] です

MATLAB では、たとえば data という一次元配列(ベクトル)の変数があるとき、最初の要素は data(1)、二番目の要素は data(2) といった具合に参照できます。しかし、Python では順番が 0 から始まります。なので、最初の要素を参照するには data[0] となりますし、二番目の要素は data[1] です。すでに例として出したように、MATLAB では要素を参照するのに () を使いますが、Python では [] です。

3. 1×n や n×1 の行列と、大きさ n のベクトルとは異なります

MATLAB では二次元配列 (行列) やベクトルを扱うとき、変数の型は気にしなくても OK でした。しかし、Python ではちゃんと考えないといけません。Python で行列を扱うための変数の型は、ndarray と DataFrame です (正確に言うと ndarray はクラスですが、統一感を出すためここでは型として説明します)。ndarray, DataFrame はそれぞれ、numpy, pandas というモジュールを import すると扱えるようになります。

ndarray, DataFrame は、それぞれ使い方が異なるため、ウェブサイトで調べるとよいです。その上で、MATLAB と Python との大きな違いに、Python ではベクトルはベクトル、があります。MATLABでは、1×n の行列は大きさ n の横ベクトルと一緒であり、n×1 の行列は縦ベクトルと一緒でした。横ベクトルと縦ベクトルとは区別されます。しかし Python では、横ベクトルも縦ベクトルもなく、あるのはベクトルだけです。もちろん、1×n の行列と n×1 の行列はありますので、以下の三つは区別されます。

  • ベクトル (一次元配列)
  • 1×n の行列 (二次元配列)
  • n×1 の行列 (二次元配列)

たとえば、大きさ n のベクトルと 1×n の行列とを足し算すると、エラーになります。MATLAB はこのあたりを気にせずに計算できたため、注意が必要です。

4. find したいときには numpy.where() です

MATLAB では、たとえば data というベクトルにおいて、目当ての値 (最大値、最小値など) の順番を探すとき、find 関数を使っていました。Python では numpy.where() を使います。

5. 指定した行や列を削除したいときには pandas.DataFrame.drop() を使いましょう

MATLAB では、行や列を削除したいとき空ベクトルや空行列を代入することで削除していました。たとえば data という行列において、5 行目を削除したいとき、data(5, 🙂 = []; としたわけです。Python では、pandas.DataFrame.drop() を使います。

6. 転置行列は numpy.array.T や pandas.DataFrame.T です

MATLAB で行列を転置するには、data’ のように後ろに ’ (シングルクオテーション) をつけました。Python では numpy.array.Tpandas.DataFrame.T です。

7. 行列同士の掛け算には numpy.dot を使いましょう

MATLAB では data1 * data2 のように2つの行列を掛ければ、いわゆる一般的な行列の掛け算になりました。Python では ndarray 型の data1, data2 について data1 * data2 とすると、行列の要素ごとの掛け算の結果が返ってきます。なので data1 と data2 の行列の大きさをそろえないといけません。一般的な行列の掛け算をしたいときには、ndarray 型にて numpy.dot を使います。

8. ゼロ行列は numpy.zeros() で作ります

MATLAB では、行列の初期化や結果の保存用に、ゼロ行列を zeros(5, 6) のようにして作成しました。Python では numpy.zeros() を使います。

9. 0 から 1の間の一様乱数は numpy.random.rand() で、平均 0, 標準偏差 1 の正規分布の乱数は numpy.random.randn() で発生させましょう

MATLAB の rand は Python では numpy.random.rand() に、MATLAB の randn は Python では numpy.random.randn() に相当します。

10. switch 文はないため、すべて if 文で書きましょう

Python に switch 文はありません。if-elif-else 文で置き換えましょう。

11. numpy, pandas, scipy, scikit-learn を使いこなしましょう

Python で初級や中級のデータ解析・機械学習を行うことは、numpy, pandas, scipy, scikit-learn というモジュールを適切かつ正確に使うことに相当します。特に scikit-learn により機械学習のいろいろな手法を実行することができます。頑張って使いこなしましょう。

 

以上です。

質問やコメントなどありましたら、twitter, facebook, メールなどでご連絡いただけるとうれしいです。

シェアする

フォローする