ソフトな忘却力(79) みんな大好きNumPyの演算子のお勉強

Joseph Halfmoon

「サイエンティフィックPythonのための」IDE、Spyder上にてScientific Python Lectures様のレクチャ実習中。NumPyの実習3回目です。Numpy配列に対する「演算子」や「関数」いろいろあり。大抵のことはNumPyで出来る。でも全てがオススメというわけでもないみたい。いろいろあるのね。

※「 ソフトな忘却力」投稿順 Index はこちら

※レクチャ実習中といっても、「準拠」しているのはレクチャの章立てくらいです。Scientific Python Lectures様のコースは例題だけでなく、エクササイズなども充実、それをキチンと解いていったら必ずや立派な人になれるだろ~と思うのです。でもキチンとやったら、死ぬまでに終わらない、多分。

行列の転置

NumPy配列は「配列」ですが、「似たようなもん(そういうことを言うと怒られそうだが)」なので「行列」としても扱える場合がある感じです。その証拠は転置ができることです。行列(配列)の後ろに .T と書くだけで転置(transpose)できます。こんな感じ。transpose

前回もスライスのところで出てきましたが、転置も「ビュー」だそうです。メモリ上の配列はそのままで、その「見方」を変えるだけだと。それが証拠に上記のように転置されていない行列の要素を書き替えると転置先?の行列の値も書き換わります。

配列の掛け算、行列の掛け算

例外はあるけど、基本、NumPy配列間での演算は、

要素毎

だそうな。同じサイズの配列の対応する要素同士を演算するもの。ただし一方がスカラーであると、配列側の全要素に1個のスカラー値が作用されます。

以下の黄色の演算は、配列要素毎の計算ですが、緑のみ行列の掛け算デス。matrixMul

 

 

1次元配列、ベクトル?

上記の例などみると、「行列」としての扱いなので、もしやベクトルにも縦ベクトルとか横ベクトルとかあって、転置したら横が縦になるのかしらん、と思ったらどうも違うようです。他の処理系(例えばScilab)では横と縦が峻別されてたりするけど(まあ、NumPy配列でもnx1の配列と1xnの配列は作れる。)

以下の例では、1次元配列(ベクトルのつもり)を転置したものと転置しないもので @ 演算してますが結果は同じ。vectorMul

一致、不一致

さて、比較演算子、論理演算子についても処理のスタンスは一貫しているみたいです。以下の == 演算子での2次元配列の比較は要素毎に処理されて結果も2次元配列に格納されて返されます。equal

一方、配列全体の比較は array_equalという関数でできるのでした。

リダクション演算

ベクトルや配列の列方向、行方向に足し込んで1個の結果にするリダクション演算は、よく使う操作じゃないかと思います。sum()という関数は何も軸を指定せずに配列に作用させると全体を一気に潰して総合計1個を返しますが、軸を指定すると、各軸にそって足し込んだ結果を1次元配列で返してくれます。その際 axisは

    • 0が縦、列毎に各行の値の合計を求める
    • 1が横、行ごとに各列の値の合計を求める

こんな感じ。sum

 

最大値のインデックスを見つける

最大値 max()、最小値min()などにも「軸」が影響するみたい。例えば2次元配列のmax()であれば、何も指定しないと全要素中の最大のものを検出。そのときにargmax()という最大値を与えるインデックスの関数が使えますが、2次元でなく1次元配列としてみたときのインデックスを返してくれます。わしゃフラット化されたインデックスでなく、ちゃんと2次元のインデックス(タプルとしてあたえられる)が欲しいのよ、という場合が以下に。max_index

ちょっちメンドイっす。

ブロードキャスティング

前回、スライスのところでも2次元配列を一行で生成する「技」で出てきたものです。お惚け老人的にホンワカ説明すると、行ベクトルと列ベクトルに対して「ブロードキャスティング」な演算を行うと行x列の行列が出来上がってしまう、という技です。特定の条件で、勝手に配列サイズが伸び縮みするのよ。なにやらすごいよ。Broadcasting

キモは緑マーカ引いた np.newaxis という新たな「次元」を付け加えるキーワードとそれに作用する「+」演算子です。

確かに「ブロードキャスト」されてるのね。。。

ソフトな忘却力(78) みんな大好きNumPyのsliceのお勉強 へ戻る

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です