モジュールって何?
聞いたことあるけど使い方はいまいち、、
今回はこんな方に向けて、pythonでよく使われるモジュールについて、その意味と使い方をご紹介していこうと思います。
pythonを勉強するうえで、モジュールは避けて通れない道となっています。
この記事を読んで少しでも理解を深めていきましょう!
この記事でわかること
- モジュールの意味
- モジュールの使い方と利便性
目次
モジュールとは?
プログラミング初心者だけど、モジュールって言葉は聞いたことある!
こういった方、もしかしたら結構いらっしゃるかもしれません。
それもそのはず。実はこのモジュールという言葉はIT用語ではなく、他の分野でもちょくちょく登場する用語なんですね。
知らない方のために一般的な意味を貼っておきます。
モジュール(英: module)とは、工学などにおける設計上の概念で、システムを構成する要素となるもの。いくつかの部品的機能を集め、まとまりのある機能を持った部品のこと。モジュールに従っているものをモジュラー(英: modular)という。
入出力を絞り込んで標準化することにより、システム開発を「すり合わせ」から「モジュールの組み合わせ」に変更できる。
モジュール - Wikipedia
では、pythonにおけるモジュールとは何なのかですが、簡単に言ってしまうと、「便利な機能や関数をまとめたもの」です。
pythonは、現在も多くの人に愛され使われている言語なので、実は世界のどこかの人が便利な機能や関数をまとめて、それを公開してくれているんですね。
Numpyとは?
先ほど説明したように、モジュールとはpythonにおける便利バッグのようなものなのですが、もちろん、世の中には多くのモジュールが存在しています。誰でも作って誰でも公開できるので、上げだしたらキリがないんですが、、、
その中でも、有名なモジュールというものが存在していて、それが今回使用するNumpyです。
実は数あるモジュールの中でも、データを扱うためのモジュールにはこのNumpyを使っていることがほとんどで、そのためにデータをNumpyの形式でそろえておく必要があったりもします。
Numpyは有名モジュールなだけあって、できることは非常に多く、すべてを説明していては日が暮れてしまいます。
なので、本記事ではNumpyを用いてできる「誰でもわかる基本的な使い方」を一緒に確認していこうと思います。
Numpyの使い方に慣れていけば、そのほかのモジュールにも応用が利きます。
まずは、モジュールの扱い方を覚えていきましょう。
Numpyの使い方
Numpyのインポート
ここからは、具体的なコードを用いて説明していきます。
実際に自分でも動作を確かめて、理解を深めていきましょう!
pythonの始め方に関しては、下記を参考にしてください。
import numpy as np
まず、Numpyを使用するために、Numpyのインポートを行わなければいけません。
上記のプログラムの一行目にあたる部分です。
こちらは、「numpyというモジュールをnpという名前で取り込む」といった操作だと思ってください。
もちろん、「as np」を消去して、名前を変えなくても問題ないのですが、この後のコード量を減らすために、普通このような記述をするので、そうなんだと思ってもらえれば大丈夫です。
Numpyを使用した配列
<input>
import numpy as np
mylist = [1, 2, 3]
data = np.array(mylist)
print(data)
<output>
[1, 2, 3]
続いて、実際にNumpyを使用してコードを記述していきます。
まず、mylistという配列をnumpy用の配列に変換してdataという変数に代入しています。
ここで、dataはnp.array形式になっています。
この段階では、print(mylist)でも同じ結果が得られるため、正直numpyを使用する意味がないのですが、このまま進めていきましょう。
Numpyを使用した行列
<input>
import numpy as np
mylist = [1, 2, 3, 4, 5, 6, 7, 8, 9]
data = np.array(mylist)
mat = data.reshape(3,3)
print(data)
print(mat)
<output>
[1, 2, 3]
[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]]
続いて、行列を作成していきます。
先ほどと比べて4行目が増えたのにお気づきでしょうか?
4行目では、numpyが持つ機能reshapeが使用されています。
こちらは、配列の形を変更する関数になっており、data.reshape(x,y)と記述することで、配列dataをx行y列の行列に変換してしまいます。
行列に対するさまざまな操作
<input>
import numpy as np
mylist = [1,2,3,4,5,6,7,8,9]
data = np.array(mylist)
mat = data.reshape(3,3)
print("**numpy.array形式の data**")
print(data)
print("**data.reshape(3,3) -> 3x3行列**")
print(mat)
print("**mat[0,1] -> (0,1)要素**")
print(mat[0,1])
print("**mat[0,:] -> 1次元目の1番目の要素すべて**")
print(mat[0,:])
print("**mat[:,1] -> 2次元目の2番目の要素すべて**")
print(mat[:,1])
print("**mat.T -> 転置**")
print(mat.T)
data1 = np.array([[1,2],[3,4]])
data2 = np.array([[5,6],[7,8]])
print("**data1**")
print(data1)
print("**data2**")
print(data2)
print("**data1+data2 -> 足し算**")
print(data1+data2)
print("**data1*data1 -> 要素ごとのかけ算**")
print(data1*data2)
print("**np.dot(data1,data2) -> 行列としてのかけ算**")
print(np.dot(data1,data2))
print("**np.r_[data1,data2] -> 1次元目でつなげる**")
print(np.r_[data1,data2])
print("**np.c_[data1,data2] -> 2次元目でつなげる**")
print(np.c_[data1,data2])
<output>
**numpy.array形式の data**
[1 2 3 4 5 6 7 8 9]
**data.reshape(3,3) -> 3x3行列**
[[1 2 3]
[4 5 6]
[7 8 9]]
**mat[0,1] -> (0,1)要素**
2
**mat[0,:] -> 1次元目の1番目の要素すべて**
[1 2 3]
**mat[:,1] -> 2次元目の2番目の要素すべて**
[2 5 8]
**mat.T -> 転置**
[[1 4 7]
[2 5 8]
[3 6 9]]
**data1**
[[1 2]
[3 4]]
**data2**
[[5 6]
[7 8]]
**data1+data2 -> 足し算**
[[ 6 8]
[10 12]]
**data1*data1 -> 要素ごとのかけ算**
[[ 5 12]
[21 32]]
**np.dot(data1,data2) -> 行列としてのかけ算**
[[19 22]
[43 50]]
**np.r_[data1,data2] -> 1次元目でつなげる**
[[1 2]
[3 4]
[5 6]
[7 8]]
**np.c_[data1,data2] -> 2次元目でつなげる**
[[1 2 5 6]
[3 4 7 8]]
続いて少し量が多いですが、先ほど行列を作成したので、その作成した行列に対していろいろな操作を行ってみましょう。
まず、12~16行目ですが、こちらは行列のある要素を指定しているような文になっています。
12行目では、1行2列の位置に存在している要素を指すことになります。
14行目では、1行目の要素すべてを指すことになります。
16行目では、2列目すべての要素を指すことになります。
mat[x, y]といった指定方法をされていたら、xは行を、yは列を指していると思ってください。
また、xもしくはyの部分に『:』が入っていた場合はすべての要素を指すことになるので覚えておきましょう。
ここで、注意してほしいのですが、配列の要素は0から開始します。
配列でいうところの0が1行目や1列目を指しているといった具合です。
開始の位置が配列の場合は0で、行や列の場合は1なのでややこしいですが、徐々に慣れていきましょう。
続いて、後半部分も見ていきましょう。
まず、20行目と21行目で二次元の配列を作っていますね。
そして、24行目と26行目でそれらを表示しています。
また、28行目~32行目では、配列同士の計算を行っています。
28行目では、要素同士の足し算
30行目では、要素同士の掛け算
32行目では、行列としての掛け算を行っているといった形です。
最後に、34~36行目ですが、また新しいコードが出てきましたね。
np.r_[x,y]で配列x,yを一次元目で繋げる。
np.c_[x,y]で配列x.yを二次元目で繋げる。
といった意味があります。
これだけ見てもよくわからないという方は、ぜひ実際にコードを書いて実行結果を確認してみてください!
【補足】その他のNumpyを用いた様々な機能
Numpyには、先ほど紹介した機能以外にも様々なものがあります。
以下では、追加の説明として、さまざまな機能のうちのいくつかをご紹介していこうと思います。
- arange
- linspace
- ones
- zeros
- random.randn
①:arange
<input>
np.arange(2, 10, 2)
<output>
array([ 2, 4, 6, 8])
arangeは、三つの引数をとることが出来る関数です。
arange(x, y, z)でxからyまでの間でzずつ数を増やしながら配列を作成するといった感じです。
ちなみに、出力結果にはyの値は含まれないので注意しましょう。
②:linspace
np.linspace(1, 10, 5)
np.linspace(1, 10, 5, endpoint=False)
<output>
array([ 1. , 3.25, 5.5 , 7.75, 10. ])
array([1. , 2.8, 4.6, 6.4, 8.2])
linspaceもarange同様、三つの引数をとることが出来る関数となっています。
linspace(x, y, z)でxからyまでの間で、z個の要素を生成するといった感じです。
ちなみに、出力結果にyの値を含むので注意しましょう。
また、二行目のように『endpoint=False』といった要素を付け加えることで、yの値を含まないような配列を作成することも可能です。
③:ones
<input>
first = np.ones((2,2))
secound = np.ones((3, 3))
print('This is first array')
print(first)
print('This is secound array')
print(secound)
<output>
This is first array
[[1. 1.]
[1. 1.]]
This is secound array
[[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]]
onesは見ての通り、ones((x, y)) で、次元数x要素数yの配列を作成するような関数です。
もちろん、配列の名前がonesなので、すべての要素が1の配列を生成します。
④:zeros
<input>
np.zeros((2,2))
<output>
[[0. 0.]
[0. 0.]]
もう皆さんお気づきかもしれませんが、zerosは要素がすべて0の配列を生成するような関数になっています。
⑤:random.randn
<input>
import numpy as np
x = np.random.randn(10)
print(x)
<output>
[ 1.2959728 0.30586524 -0.46798536 0.00194312 -0.11613653 0.58680453
-0.97405396 -1.25276013 -0.97410073 1.12158254]
random.randn()は、指定した個数の数値をランダムで生成してくれます。
ただ、数値を見るとどれも-2~2の間に収まっていますよね。
もちろん偶然ではありません。
この関数は、平均0標準偏差1の標準正規分布といった分布に基づいて数値を生成しています。
一応分布のグラフは下に貼っておきますが、現段階でそこまで意識する必要もないのでよくわからない方は「へー。」と思っておいて下さい。
まとめ
ここまで見ていただいた皆さん、お疲れさまでした。
今回は、そもそもNumpyとは何か?といったところから、Numpyの具体的な使い方についてご紹介してきました。
もちろん、Numpyでは様々なことが出来るため、今日紹介したものはほんの一部分にすぎないのですが、「興味がわいた」、「もっと知りたい」といった方は、ぜひ私の他の記事を見たり、インターネットで調べてみるなりして、Numpyを使いこなしてしまいましょう。