こんにちは。すのくろです。
今回は、行列計算に用いる「Numpy」を使った行列の様々な作成方法について説明したいと思います。
[この記事で学べること]
- 基本的な行列(ベクトル)の作成方法
- 規則的な数列の作成方法
- 零行列の作成方法
- 単位行列の作成方法
- 乱数行列の作成方法
これらの方法を学ぶことで、Numpyを使って今後のデータの整理等に役立てることができるかと思います。それではやっていきましょう!
準備|使用するライブラリNumpyのインポート
まずはNumpyを使うためにライブラリをインポートします。
インポートの方法は下記のコードの通りです。
こちらはもう一般的メモなので、このままコピペでOKです。
# NumPyのインポートの仕方
import numpy as np
np.array():行列の作成(基本)
それでは、早速Numpyを使って行列を作っていきましょう。
初めにリストから行列を作成します。
コードはnp.array()でおこないます。コードは下記の通りです。
# ベクトルを作成
v = np.array([1, 2, 3, 4])
print(v)
print()
# 行列を作成
matrix = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
print(matrix)
実行結果↓
[1 2 3 4]
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
これらの行列は足したり引いたりすることができます。
行列はそれぞれの要素同士で足したり引いたりすることができます。
同様に、行列同士をかけたり、割ることも出来ます。
[ 足し算、引き算 (+, -) ]
m1 = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
m2 = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
m1_2 = m1 + m2
# m1_2 = m1 - m2
実行結果↓
array([[ 2, 4, 6, 8],
[10, 12, 14, 16],
[18, 20, 22, 24]])
[ かけ算、割り算 (*, /) ]
m12 = m1 * m2
# m12 = m1 / m2
実行結果↓
array([[ 1, 4, 9, 16],
[ 25, 36, 49, 64],
[ 81, 100, 121, 144]])
np.arange(x):0からx未満までの整数のベクトルを作成
ここからは数列などによって行列を作成する方法について解説します。
まずはかなり使うnp.arange()です。
これは、ある数までの整数を一気に並べた一列のベクトルを作成します。
引数が数字一つなら、0からその数未満までの整数を作成します。
# np.arange(x): 0からx未満までの整数のベクトルを作成
np.arange(5) # np.arange(0, 5, 1)と同じ
実行結果↓
array([0, 1, 2, 3, 4])
また、引数は下記のように他にも設定できます。
np.arange(start=0, stop, step)
実は、先ほどの数字一つ(5)を入れた例では、厳密にはstopにその値(5)が入っています。
下記と同じことです。
np.arange(start=0, stop=5, step=1)
startや、stepの数も変更するとどうなるかをみてみましょう。
# np.arange(start, stop, step)
np.arange(1, 14, 2)
実行結果↓
array([ 1, 3, 5, 7, 9, 11, 13])
1~14未満までの整数を2個ずつ(1個飛ばし)で作成していることが分かります。
また、ちょっとした応用例として、数列を降順で作成する方法も説明します。
やり方は、「step」を負の数にすればOKです。
# 降順もstepを負の数にして可能
np.arange(10, 1, -1)
実行結果↓
array([10, 9, 8, 7, 6, 5, 4, 3, 2])
np.linspace():均等区切りの数列を作成
次に、np.linspace()についての説明です。
これは、ある数からある数までを等間隔で区切った数列の作成方法です。
具体的には、
np.linspace(start, stop, num)
のコードになります。
startからstopまで(stop含む)の整数の範囲をnum数で均等に区切った場合の値のリストを作成します。
例は下記の通りです。
# np.linspace(start, stop, num)
np.linspace(1, 21, num=5)
実行結果↓
array([ 1., 6., 11., 16., 21.])
1から21までの整数の中で、等間隔で5個抜き出しています。下がイメージです。
np.linspace()は「最初と最後の数が決まっていて、残りを均等に振り分けたいな」という時に使えますね。
np.zeros():零数列の作成
次に、np.zeros()を使った零数列の作成方法です。
まず、1列だけ(ベクトル)の場合は下記の通りです。
# np.zeros(num)
# num数の零行列
np.zeros(4)
実行結果↓
array([0., 0., 0., 0.])
行と列が複数の場合は下記の方法のように、まずタプルで行列数を指定しておきます。
num = (4, 4)
np.zeros(num)
実行結果↓
array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])
np.ones():要素が全て1の数列の作成
0行列と同じように、np.ones()で要素が全て1の数列も作成可能です。
# np.ones(num)
# num数の全て1の行列
print(np.ones(4))
print()
num = (4, 4)
print(np.ones(num))
実行結果↓
[1. 1. 1. 1.]
[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]
np.eye():単位行列(対角成分が全て1の正方行列)の作成
np.eye(num)を用いて、num x num 数の単位行列(対角成分が全て1の正方行列)を作成できます。
np.eye(4)
実行結果↓
array([[1., 0., 0., 0.],
[0., 1., 0., 0.],
[0., 0., 1., 0.],
[0., 0., 0., 1.]])
np.random.rand():乱数行列の生成
最後に「np.random.rand()」による乱数の生成方法です。
# 乱数の生成
np.random.rand(4)
実行結果↓
array([0.97300719, 0.366093 , 0.21688207, 0.44661811])
2次元の場合は行数と列数を指定するだけです。
# 行列の乱数生成
np.random.rand(4, 3)
実行結果↓
array([[0.04020927, 0.18264194, 0.67844464],
[0.03486638, 0.74963835, 0.85250156],
[0.38312569, 0.98561541, 0.01458389],
[0.40127745, 0.76973004, 0.10313077]])
ちなみにデフォルトだと1以下の乱数なので、値が大きい行列を作成したい場合は10とか100とかかけてあげても良いです。
# 桁数変えたい場合
np.random.rand(4, 3)*100
実行結果↓
array([[33.94640936, 70.42128032, 48.00241352],
[49.24635572, 79.31455942, 84.91560902],
[ 7.75713085, 9.24647214, 44.41761839],
[59.54072446, 50.43255485, 51.91916992]])
あとは乱数だとかなり少数点以下が細かいものが生成されるので、もう少しざっくりとした値が欲しい場合は、例えば「.round()」を使って小数点以下を丸めたりするのもありです。
# 有効数字の表示変えたい場合
(np.random.rand(4, 3)*100).round()
実行結果↓
array([[62., 27., 20.],
[35., 84., 6.],
[ 7., 93., 89.],
[80., 23., 1.]])
まとめ
今回は、関数を用いて、様々な行列を作成する方法を説明しました。
これらの方法はすぐに役立つものもあれば、使わないものもあるかもしれませんが、今後、画像処理やデータ集計などのための基礎知識として使う場面があるかもなので頭の片隅に覚えていただければ幸いです。
ここまでお読みいただきありがとうございました!
コメント