みなさん、こんにちは。 エンジニアをしております、三雲と申します。
私はたまにですが初心者にプログラミングについて教えたりすることがあります。
特に Python は人気で、理由として『データ分析』が簡単に行えるところで興味を持たれる方が多いようです!
データ分析というと少し難しそうに感じるかもしれませんが、Python を使うと思ったよりも簡単に行なえます。
この機会に試してみてはいかがでしょうか?
今回は紙書籍版『Pythonによるあたらしいデータ分析の教科書 第2版(翔泳社)』では、p.106 〜 p.113 の部分になります。
テーマは「NumPy でいろいろな行列を作成する」です。
せっかくですので私も初心に戻り、新人エンジニアやこれからエンジニアを目指している方の「Python でデータ分析を勉強してみよう!」という視点で、分かりやすい記事になればと思います。
どうぞよろしくお願いいたします。
そもそも NumPy とは
前回のコラムでも書きましたが、改めておさらいです。
NumPy は Python の数値計算のためのライブラリです。
NumPy の主な機能は、多次元配列(ndarray)オブジェクトをサポートすることで、これにより数値データの効率的で高速な操作を可能にします。
少し難しい言い回しになってしまいましたが、Python のリストより高度な計算が素早く行えるライブラリということのようです。
NumPy のもう一つの特徴として、多くの Python のライブラリの基礎部分として使用されるため、他のライブラリと一緒にインストールされることが多いです。
それほど非常に便利なパッケージなので、Python でプログラミングする方は NumPy の使い方を覚えておいて損はないです。
NumPy は pip でインストールできます。
『Pythonによるあたらしいデータ分析の教科書 第2版(翔泳社)』で使用するバージョンは p.50 にあるとおりのものを指定しましょう。
バージョンによって、使用できるメソッドや引数など変更がある場合がありますので、書籍通りのバージョンをインストールすることが重要です。
書籍通りに動かない場合、よくよく調べてみると「書籍のバージョンと異なるバージョンがインストールされていたことが原因だった」というケースもありますので、ご注意ください。
pip install numpy==1.22.4
NumPy を使うにはパッケージをインポートしておく必要がありますので、忘れずにしておきましょう。
import numpy as np
NumPy でいろいろな行列を作成する
NumPy で行列は作れるのですが、実際に作りたい行列はどの関数で作ればいいのでしょうか?
行列のイメージから適切な関数を書籍から探してみましょう。
行列の項目をすべて同じ項目にする
すべて同じ数値で行列の項目を埋め尽くす方法です。
例えば、次のようにすべて 9
にしたいとします。
![[NumPy_full.png]]
書籍の p.111 〜 p.112 を確認すると、full()
を使うとよいようです。
import numpy as np
a = np.full((3, 4), 9)
結果は次のとおりとなりました。
array([[9, 9, 9, 9],
[9, 9, 9, 9],
[9, 9, 9, 9]])
行列の項目をすべて 1 にする
先ほどと同じなのですが、今度はすべての項目を 1 にしてみましょう。
![[NumPy_ones.png]]
書籍の p.111 を確認すると、ones()
を使うとよいようです。
import numpy as np
a = np.ones((3, 4))
結果は次のとおりとなりました。
array([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])
ここで 1.
と小数点が付いていますが、これは浮動小数扱いとなるようです。
さきほどの fill()
でもできそうなので試してみました。
b = np.full((3, 4), 1.)
結果は次のとおりとなりました。
array([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])
同じ結果を得るためにやり方は一つとは限らないですね。
ただし、特に理由がなければ ones()
のほうが 1.
のみの行列を作るという目的がわかりやすくなるため、ones()
にしておいたほうが良いと思います。
コードは読むときに目的がわかるようにしておくことも大事かと思います。
行列の項目をすべて 0 にする
今度はすべての項目を 0 にしてみたいと思います。
![[NumPy_zeros.png]]
書籍の p.110 を確認すると、zeros()
を使うとよいようです。
import numpy as np
a = np.zeros((3, 4))
結果は次のとおりとなりました。
array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])
ここで 1.
と小数点が付いていますが、これは浮動小数扱いとなるようです。
さきほどの fill()
でもできそうなので試してみました。
b = np.full((3, 4), 0.)
結果は次のとおりとなりました。
array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])
こちらも同様に、特に理由がなければ zeros()
のほうが 0.
のみの行列を作るという目的がわかりやすくなるため、zeros()
にしておいたほうが良いと思います。
単位行列を作成する
単位行列とは、行列の対角成分が全て 1
、それ以外の成分が 0
のものです。行と列の数が同じ数になっていることも特徴ですね。
対角成分とは、行列の左上隅から右下隅に向かう成分のことです。
![[NumPy_eye.png]]
書籍の p.111 を確認すると、eye()
を使うとよいようです。
import numpy as np
a = np.eye(5)
結果は次のとおりとなりました。
array([[1., 0., 0., 0., 0.],
[0., 1., 0., 0., 0.],
[0., 0., 1., 0., 0.],
[0., 0., 0., 1., 0.],
[0., 0., 0., 0., 1.]])
乱数行列を作成する
乱数とは、規則性のないランダムな数値です。
Python の勉強をするときに、適当な数値の行列が欲しくなるときに使うものですね。
![[NumPy_random.png]]
書籍の p.106 〜 p.110 を確認すると、random()
を使うとよいようです。
import numpy as np
rng = np.random.default_rng()
a = rng.random((3, 4))
結果は次のとおりとなりました。
ただ、数値が書籍と異なります。
array([[0.52295323, 0.64861462, 0.82990185, 0.97286965],
[0.64596803, 0.75403276, 0.46150227, 0.63150051],
[0.28453536, 0.60291907, 0.24632528, 0.69555684]])
乱数だからこれでいいのでしょうか?
実は乱数を書籍とあわせる方法があります。それはシード値というものを設定するとよいようです。
書籍の p.107 を確認してください。
コードを書籍どおりに自分の PC で実行したときに、同じ結果が表示できると初心者としては安心できますね!
import numpy as np
rng = np.random.default_rng(123)
a = rng.random((3, 4))
結果は次のとおりとなりました。
数値は書籍とおなじになりました。
array([[0.68235186, 0.05382102, 0.22035987, 0.18437181],
[0.1759059 , 0.81209451, 0.923345 , 0.2765744 ],
[0.81975456, 0.88989269, 0.51297046, 0.2449646 ]])
実務では乱数が再現されるというのは問題があるため、状況を再現するときだけ使ってください。
書籍にもその旨が丁寧に解説してありました。
今回のコラムはいかがでしたでしょうか? 少しでも皆様の学習のお役に立てると嬉しいです。
インターネットアカデミーでは Python 講座が充実しています。
Python 認定スクールにもなっているため、質の良い知識を得ることができます。
基礎を習得した先に新たな目標を設定し、目指していくために大変良い場所となります。
「プログラミングは独学でもなんとかなる」という情報もありますが、新しいことを学んでいく際の近道は「プロに教えてもらうこと」かと思います。
インターネットアカデミーはキャリアサポートも充実しており、一人ひとりに専任のキャリアプロデューサーがサポートしてくれるため中途半端になることがありません。
ご興味ある方は各講座のページを覗いてみてください。無料カウンセリングもできます。
https://www.internetacademy.jp/course/programming/chair_py.html