MATLAB/OctaveユーザーのためのPython NumPyライブラリ(1)
この記事のまとめ
- MATLAB/OctaveとPythonのNumPyライブラリ比較
- NumPyのarray型とmatrix型の比較
背景
最近の私がよく使うプログラミング言語はPythonとMATLABなのですが、基本的にPythonで算術計算をあまりすることはなく、行列計算などを必要とするプログラムについては、MATLABでしかやったことがありませんでした。
機械学習を学んでいると、Pythonで行列計算などの算術計算をする必要がありそうなので、MATLABと対比しながら、Pythonでどのように行列計算を行っていくかをまとめたいと思います。
基本的にはSciPyの公式ページにまとまっている記事があるので、要点だけ抽出してこちらに日本語で記載していきたいと思います。
重要な違い
MATLAB | NumPy |
---|---|
基本のデータ型がdouble精度の浮動小数点型の多次元配列。2次元インスタンスにおける演算は線形代数の行列演算用に設計されている。 | NumPyではarray 型が多次元配列。通常の演算子による演算は要素ごとの演算となる。ただし、線形代数用にarray 型のサブクラスとしてmatrix 型もある。matrix クラスでの演算は線形代数演算となる。 |
配列の要素のインデックスが1から始まる | 配列の要素のインデックスが0から始まる |
他にもいろいろありますが、基本的な概念のとして、MATLABはプロトタイピングに適した言語であって、非常にわかりやすく、使い易い反面、メモリー消費が激しかったりして、それを商用的に使うような言語ではありません。
それに対して、Pythonは一般的にはスクリプト言語でもあるため、実行速度は単純なコーディングでは大して早くないですが、NumPyなどの科学計算用のライブラリを備えながら、並列計算やGPGPU用などのさまざまなライブラリやコンパイラなど高速化できる要素が出てきていることもあって、いわゆるデータサイエンティストが機械学習用に商用利用しても遜色のない言語になってきています。
そのあたりを前提として、それぞれの違いを考えた方がよいとは思います。
詳細は下記の記事などを読むとよくわかると思います。
array
型を使うべきか?matrix
型を使うべきか
端的に言うとarray
型を使うべき
端的な理由は下記の通りです。
- 多くのNumPy関数は
array
型を返す - 要素ごとの演算と線形代数演算が明確に分かれている
- 配列として扱うことも、行ベクトル、列ベクトルも扱うこともできる
詳細に書くと下記の通りです。
array 型 |
matrix 型 |
---|---|
* 演算子は要素ごとの掛け算。dot() 関数が行列積演算として使われる。 |
* 演算子は行列積演算。multiply() 関数が要素ごとの掛け算として使われる。 |
Nx1 、1xN のベクトルを扱うこともできるし、N 個の1次元配列を扱うことができる。例えば、A[:,1] とした場合、N 個の1次元配列として扱われる(Nx1 の列ベクトルではない)。 |
1次元配列は、Nx1 、1xN の列ベクトルや行ベクトルには変換されない。A[:,1] とした場合、Nx1 の列ベクトルとして扱われる。 |
2次元より大きいオブジェクトを扱うことができる | 常に2次元のオブジェクトのみを扱う |
.T によって転置ができる |
.T で転置だけでなく、.H 、.I 、.A によって複素共役転置(随伴行列、エルミート転置)、逆行列、asarray() をできる |
array コンストラクターはPythonの配列表現で初期化する: array([[1,2,3],[4,5,6]]) |
matrix コンストラクターは文字列表現で初期化することもできる: matrix("[1 2 3; 4 5 6]") |
なお、array
型とmatrix
型の演算を行うとmatrix
型になります。
今回は以上です。次回はMATLABとNumPyのソースコードの違いを見ていきます。 最後まで読んでいただき、ありがとうございます。
コメント
コメントを投稿