Pythonをある程度分かったところで
データ解析には便利なライブラリがあるので
その使い方を覚えていきましょう
まずはライブラリをインポート、別名をnpとしておきます
numpyでは行列を扱うことができます
数値の行列を作ってみましょう
まずは配列を作ってarray関数で行列を作ります
これで1行5列の配列が出来上がります
中身を見てみましょう
配列と同じ要素を持った行列の出来上がりです
1次元の配列を行列にした場合は
線形代数でいう「ベクトル」になります
要素を取り出す場合
配列のように「スライス」や「添え字」が使えます
1番目が0なので2は3番目の要素が返ります
スライスだと
また要素を代入する場合にもこの方法は使えます
この場合、5番目から8番目までの要素に
10を代入したことになります
次に多次元配列です
新たに配列を作り、それを
さらに配列として格納し、多次元配列を作ります
これで行列を作ります
これで2行5列の行列が出来上がります
2次元以上を線形代数でいう「配列」となります
要素の取り出しの際
多次元では取り出しも多次元にしないといけません
この場合は1行目です
個別の数値を取り出したい場合は
添え字を多次元にするか
スライスを多次元にします
作った行列の構成を確認したい場合は
shapeで確認できます
格納されているデータのデータ型が知りたい場合は
dtypeで確認できます
数値型を格納しているのでこう表示されます
行列では要素が全て同じデータ型でないといけません
特殊な行列の作り方もあります
まずは全てが0の行列
全てが1の行列の場合は
空の場合は
この場合、数値が入っているように見えますが
中身は空です
体格成分に1、他が0になるものを単位行列といい
eye関数で作れます
range関数のように連続した数値を作ることもできます
range と同じようにn個飛ばしも出来ます
返ってくるのはarray型となります
またreshapeで行列の形を変えることもできます
arangeで作った1行の行列を4行4列の行列にするには
「ベクトル」「行列」の列と行を入れ替えることを転置といい
numpyでは .Tで行えます
5行3列の行列が転置され3行5列になります
transpose関数も.Tと同じことになります
numpyの行列同士の計算も出来ます
2つの行列の足し算では要素同士が足され
引き算では引かれます
numpyで作った行列の掛け算は
要素同士が掛け合わされます
割り算も同様で要素同士の割り算です
累乗は
ただし、線形代数における行列の積は計算方法が違います
「ベクトル」×「スカラー」
「スカラー」×「ベクトル」
これについては特に問題なく「ベクトル」が返りますが
「ベクトル」×「ベクトル」
「ベクトル」×「行列」
「行列」×「ベクトル」
「行列」×「行列」
この場合の計算方法は単純な掛け算とは違うので
注意が必要です
いわゆる内積はdot関数で求められます
単純な掛け算では
と返る値が違うので注意しましょう
線形代数における行列の内積は
次のように求めます
各要素の掛け算したものの足し算です

なお「ベクトル」や「行列」の内積を求める際には
ルールがあり、行数などが等しくないと求められません
行列の数が合わない計算はエラーになります
行列B
行列の積ABとするとき
Aの列数とBの行数が一致しないと
使えないことになりますので注意しましょう
参考までに
データ解析には便利なライブラリがあるので
その使い方を覚えていきましょう
まずはライブラリをインポート、別名をnpとしておきます
import numpy as np
numpyでは行列を扱うことができます
数値の行列を作ってみましょう
まずは配列を作ってarray関数で行列を作ります
my_list1 = [1,2,3,4,5] my_array1 = np.array(my_list1)
これで1行5列の配列が出来上がります
中身を見てみましょう
my_array1
array([1, 2, 3, 4, 5])
配列と同じ要素を持った行列の出来上がりです
1次元の配列を行列にした場合は
線形代数でいう「ベクトル」になります
要素を取り出す場合
配列のように「スライス」や「添え字」が使えます
arr_1 = np.array([1,2,3,4,5,6,7,8]) arr_1[2]
3
1番目が0なので2は3番目の要素が返ります
スライスだと
arr_1[3:7]
array([4, 5, 6, 7])
また要素を代入する場合にもこの方法は使えます
arr_1[4:8]=10 arr_1
array([ 1, 2, 3, 4, 10, 10, 10, 10])
この場合、5番目から8番目までの要素に
10を代入したことになります
次に多次元配列です
新たに配列を作り、それを
さらに配列として格納し、多次元配列を作ります
my_list2 = [10,20,30,40,50] my_lists = [my_list1,my_list2] my_lists
[[1, 2, 3, 4, 5], [10, 20, 30, 40, 50]]
これで行列を作ります
my_array2 = np.array(my_lists) my_array2
array([[ 1, 2, 3, 4, 5],
[10, 20, 30, 40, 50]])これで2行5列の行列が出来上がります
2次元以上を線形代数でいう「配列」となります
要素の取り出しの際
多次元では取り出しも多次元にしないといけません
array_2d = np.array([[1,2,3],[4,5,6],[7,8,9]]) array_2d[0]単に添え字を使うと行が返ってきます
この場合は1行目です
個別の数値を取り出したい場合は
array_2d[0][2]
3
添え字を多次元にするか
スライスを多次元にします
array_2d[1:2,1:3]
array([[5, 6]])
作った行列の構成を確認したい場合は
shapeで確認できます
my_array2.shape
(2, 5)
格納されているデータのデータ型が知りたい場合は
dtypeで確認できます
my_array2.dtype
dtype('int64')数値型を格納しているのでこう表示されます
行列では要素が全て同じデータ型でないといけません
特殊な行列の作り方もあります
まずは全てが0の行列
np.zeros((3,5))
array([[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.]])全てが1の行列の場合は
np.ones((3,5))
array([[ 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1.]])空の場合は
np.empty((2,2))
array([[ 0.00000000e+000, 0.00000000e+000],
[ 2.12306430e-314, 2.12307357e-314]])この場合、数値が入っているように見えますが
中身は空です
体格成分に1、他が0になるものを単位行列といい
eye関数で作れます
np.eye(4,4)
array([[ 1., 0., 0., 0.],
[ 0., 1., 0., 0.],
[ 0., 0., 1., 0.],
[ 0., 0., 0., 1.]])range関数のように連続した数値を作ることもできます
np.arange(5,10)
array([5, 6, 7, 8, 9])
range と同じようにn個飛ばしも出来ます
np.arange(1,100,7)
array([ 1, 8, 15, 22, 29, 36, 43, 50, 57, 64, 71, 78, 85, 92, 99])
返ってくるのはarray型となります
またreshapeで行列の形を変えることもできます
arangeで作った1行の行列を4行4列の行列にするには
array_a2 = np.arange(16).reshape(4,4) array_a2
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])「ベクトル」「行列」の列と行を入れ替えることを転置といい
numpyでは .Tで行えます
ar3_5 = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15]]) ar3_5.T
array([[ 1, 4, 7, 10, 13],
[ 2, 5, 8, 11, 14],
[ 3, 6, 9, 12, 15]])5行3列の行列が転置され3行5列になります
transpose関数も.Tと同じことになります
numpyの行列同士の計算も出来ます
ar1 = np.arange(1,6) ar2 = np.arange(2,7) print (ar1) print (ar2) print (ar1 + ar2) print (ar1 - ar2)
[1 2 3 4 5] [2 3 4 5 6] [ 3 5 7 9 11] [-1 -1 -1 -1 -1]
2つの行列の足し算では要素同士が足され
引き算では引かれます
numpyで作った行列の掛け算は
要素同士が掛け合わされます
ar3 = np.array([[1,2,3],[4,5,6]]) ar4 = np.array([[4,5,6],[7,8,9]]) print (ar3) print (ar4) print (ar3 * ar4)
[[1 2 3] [4 5 6]] [[4 5 6] [7 8 9]] [[ 4 10 18] [28 40 54]]
割り算も同様で要素同士の割り算です
ar3 = np.array([[1,2,3],[4,5,6]]) ar4 = np.array([[4,5,6],[7,8,9]]) print (ar3 / ar4)
[[ 0.25 0.4 0.5 ] [ 0.57142857 0.625 0.66666667]]
累乗は
print (ar3 ** ar4)
[[ 1 32 729] [ 16384 390625 10077696]]
ただし、線形代数における行列の積は計算方法が違います
「ベクトル」×「スカラー」
「スカラー」×「ベクトル」
これについては特に問題なく「ベクトル」が返りますが
ar1 * 5
array([ 5, 10, 15, 20, 25])
「ベクトル」×「ベクトル」
「ベクトル」×「行列」
「行列」×「ベクトル」
「行列」×「行列」
この場合の計算方法は単純な掛け算とは違うので
注意が必要です
いわゆる内積はdot関数で求められます
ar3_1 = np.array([[1,2,3],[4,5,6],[7,8,9]]) ar3_2 = np.array([[9,6,3],[8,5,2],[7,4,1]]) print(ar3_1) print(ar3_2) print(np.dot(ar3_1,ar3_2))
[[1 2 3] [4 5 6] [7 8 9]] [[9 6 3] [8 5 2] [7 4 1]] [[ 46 28 10] [118 73 28] [190 118 46]]
単純な掛け算では
ar3_1 * ar3_2
array([[ 9, 12, 9],
[32, 25, 12],
[49, 32, 9]])と返る値が違うので注意しましょう
線形代数における行列の内積は
次のように求めます
各要素の掛け算したものの足し算です

なお「ベクトル」や「行列」の内積を求める際には
ルールがあり、行数などが等しくないと求められません
ar4_1 = np.array([1,2,3,4]) ar5_1 = np.array([1,2,3,4,5]) ar4_1.dot(ar5_1)
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-69-830289c260b1> in <module>() 1 ar4_1 = np.array([1,2,3,4]) 2 ar5_1 = np.array([1,2,3,4,5]) ----> 3 ar4_1.dot(ar5_1) ValueError: shapes (4,) and (5,) not aligned: 4 (dim 0) != 5 (dim 0)
行列の数が合わない計算はエラーになります
ar3_5 = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15]]) ar5_3 = np.array([[9,6,3,7,9],[8,5,2,5,6],[7,4,1,5,5]]) ar3_5.dot(ar5_3)
行列Aarray([[ 46, 28, 10, 32, 36], [118, 73, 28, 83, 96], [190, 118, 46, 134, 156], [262, 163, 64, 185, 216], [334, 208, 82, 236, 276]])
行列B
行列の積ABとするとき
Aの列数とBの行数が一致しないと
使えないことになりますので注意しましょう
参考までに

コメントする