Pythonをある程度分かったところで
データ解析には便利なライブラリがあるので
その使い方を覚えていきましょう

まずはライブラリをインポート、別名を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]])

と返る値が違うので注意しましょう

線形代数における行列の内積は
次のように求めます
各要素の掛け算したものの足し算です
gg33

 なお「ベクトル」や「行列」の内積を求める際には
ルールがあり、行数などが等しくないと求められません
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)
array([[ 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]])

行列A
行列B
行列の積ABとするとき

Aの列数とBの行数が一致しないと
使えないことになりますので注意しましょう



参考までに