Pythonの数値演算ライブラリ、Numpyについて知っておきたい機能をまとめていきたいと思います。
Numpyは、画像処理やデータ分析する際に、ほぼ必須となるライブラリなので、使用頻度の高い機能については最低限覚えておきたいですよね。
この記事は、自分が何度も調べたり、忘れてしまったりすることを重点的にまとめました。いわゆる備忘録ってやつです。
Numpyの操作については、レファレンスを読めばわかることなのですが、いちいち探すのが手間なので記事としてすぐに見れるようにしておきたいと思った次第です。
わからないことが解決できて、お役に立てたら幸いです。
■Numpyで配列を操作する方法
私がよく使う、よく調べる配列の操作方法についてまとめました。
流れとしては、「やりたいこと」→「使うメソッド(具体的に)」→「コードの解説」のように書いていきます。
そのため、調べたいことがある場合は少し上に戻って目次の部分で検索していただけるとすぐに見つけられると思います。
なお、メソッド、コードの説明時には、Numpyを以下のようにインポートしたことを前提にして説明しますので、あらかじめご了承ください。
1 |
import numpy as np |
・配列の形を調べる
shape(調べたい配列)
1 2 3 4 5 6 7 |
A = [[[1,2,3],[4,5,6]], [[7,8,9], [10,11,12]]] #shape 全体の形がわかる print(np.shape(A)) #ndim 次元 print(np.ndim(A)) |
結果
1 2 |
$ (2, 2, 3) /shape 外側の[]から順に並んでいる $ 3 /ndim |
shapeメソッドを使えばNumpy配列の形を調べることができます。出力は外側の[]から内側の[]の順に、それぞれの要素数が並びます。
緑[]の要素数が2、オレンジ[]の要素数が2、青[]の要素数が3となっていますね。ちなみに画像配列をこの例に当てはめると、緑が高さ、オレンジが幅、青がRGBの数値になります。
[[[1,2,3],[4,5,6]], [[7,8,9], [10,11,12]]]
また、ndimで配列の次元数を調べられます。Aの次元は[]が三重となっているので3次元配列です。
・配列の形を変換
1.transpose(変換したい配列)
1 2 3 4 |
A = [[[1,2,3],[4,5,6]], [[7,8,9], [10,11,12]]] #転置 print(np.transpose(A)) |
結果
1 2 3 4 5 6 7 8 |
$ [[[ 1 7] [ 4 10]] [[ 2 8] [ 5 11]] [[ 3 9] [ 6 12]]] |
配列の順序を入れ替えます。転置です。右に1つずつずれて、(2,2,3)→(3,2,2)の配列となっています。
2.reshape(変換したい配列, 変換後の形状)
1 2 3 4 5 |
A = [[[1,2,3],[4,5,6]], [[7,8,9], [10,11,12]]] #reshape 変形 reshape_A = np.reshape(A, (4, 3)) print(reshape_A) |
結果
1 2 3 4 |
S [[ 1 2 3] [ 4 5 6] [ 7 8 9] [10 11 12]] |
配列の形を変更できます。上のように3次元配列→2次元配列に変換もできます。
変形の際は要素数の合計を変換前後で合わせる必要があります。例だと変換前は(2×2×3=12)、変換後は(4×3=12)ですね。
・新たな列を追加
np.append(受け手の配列, 追加したい配列, axis=追加したい軸)
1 2 3 4 5 |
A = [[[1,2,3],[4,5,6]], [[7,8,9], [10,11,12]]] #append 追加 append_A = np.append(A, [[[10,20,30],[40,50,60]], [[70,80,90],[100,110,120]]], axis=0) print(append_A) |
結果
1 2 3 4 5 6 7 8 9 10 11 |
[[[ 1 2 3] [ 4 5 6]] [[ 7 8 9] [ 10 11 12]] [[ 10 20 30] [ 40 50 60]] [[ 70 80 90] [100 110 120]]] |
要素数、形状を受けての配列と追加したい配列で合わせれば新たな配列を追加できる。
例では、Aとまったく同じ形状の配列をAに追加しています。
・正規化・標準化
Numpyには正規化を行ってくれるメソッドはありませんでした。
しかし、Max,min,stdなどは算出するメソッドがあるので、そちらを使って自分で関数化することも可能です。
min-max normalization 最大1、最小値0の正規化
1 2 3 4 5 6 7 8 9 10 |
A = [[[1,2,3],[4,5,6]], [[7,8,9], [10,11,12]]] def normalize(x): x_max = np.max(x) x_min = np.min(x) y = (x - x_min) / (x_max - x_min) return y print(normalize(A)) |
結果
1 2 3 4 5 |
$[[[0. 0.09090909 0.18181818] [0.27272727 0.36363636 0.45454545]] [[0.54545455 0.63636364 0.72727273] [0.81818182 0.90909091 1. ]]] |
データの値を、最小0最大1の範囲に正規化します。上の例だとわかりやすいですね。一番初めの1が最小なので0、一番最後の12が最大なので1として出力されています。
z-score normalization, standardization 平均0、分散1の標準化
1 2 3 4 5 6 7 8 9 10 |
A = [[[1,2,3],[4,5,6]], [[7,8,9], [10,11,12]]] def nomalize(x): x_mean = np.mean(x) x_std = np.std(x) y = (x-x_mean) / x_std return y print(nomalize(A)) |
結果
1 2 3 4 5 |
$ [[[-1.59325501 -1.30357228 -1.01388955] [-0.72420682 -0.43452409 -0.14484136]] [[ 0.14484136 0.43452409 0.72420682] [ 1.01388955 1.30357228 1.59325501]]] |
配列のデータの分布の平均が0、分散が1となるようにデータが変換されます。
正規化・標準化の使い分けについては、以下の記事が参考になると思います。
■まとめ
今回はここまでとなります。
まとめた内容はPythonでデータ処理を行う際は必須の内容なので、覚えておくと後々楽になると思います。
以降、調べた内容を適宜追加していく予定です。
なお、もっと詳しく知りたい方は以下リンクのNumpyリファレンスを読んでみてください。
今回まとめた内容は、私が機械学習を学ぶ上で調べた事柄です。ゼロから作るDeepLearningという本を読みつつ自分で調べていました。
内容がしっかりしていて初心者にも読みやすいです。機械学習に興味がある方におすすめですよ!
以上になります。最後まで読んでいただきありがとうございました。