numpy

numpyは高速な線形代数のライブラリ。行列演算が得意。

データ分析で使うpandasの基礎

 

行列の生成

import numpy as np  \\numpyをnpとしてインポート

 

arr1 = np.array([1,2,3])   \\arr1に行列を入れる

arr1

out:array([1, 2, 3])

 

arr2 = np.array([4,5,6])

arr2

out:array([4, 5, 6])

 

arr1 + arr2           \\行列同士を足す

out:array([5, 7, 9])        \\要素と要素が足されている

 

 

 

 

2次元の数列

 

arr3 = np.array([[1,2],[3,4],[5,6]])   \\2次元の行列を作る

arr3

out:array([[1, 2],     \\このように3行、2列の行列ができた

               [3, 4],

               [5, 6]])

 

arr3.shape  \\shape関数は行列の形を回答する

out:(3, 2)  \\3行、2列とわかる

 

 

arange関数

\\エーレンジ関数と読む
arr4 = np.arange(10)        //10個の要素の数列を作る

arr4

out:array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])  //0~9までの10個の要素の数列を作った

  

 

reshape関数

 

np.arange(9).reshape(3,3)   //それをreshapeで3行3列にする

out:array([[0, 1, 2],     //こうなる

            [3, 4, 5],

            [6, 7, 8]])

 

arr3.reshape(-1)      //arr3については1次元をマイナスすると

out:array([1, 2, 3, 4, 5, 6])  //2次元だったものが1次元になる

 

zeros関数

np.zeros(3)

out:array([0., 0., 0.])   //ゼロが3個の数列ができる

 

np.zeros([3,3])     //大かっこで3が3個

out:array([[0., 0., 0.],  //ゼロが3個が3個できる

           [0., 0., 0.],

 

           [0., 0., 0.]])

 

ones関数

np.ones([3,4])          \\zerosじゃなくてonesにすると 3✖4

out:array([[1., 1., 1., 1.],

               [1., 1., 1., 1.],

               [1., 1., 1., 1.]])         \\1が3行4列で行列が作れた

 

 

empty関数

np.empty([3,3])    \\emptyが3行3列

out:array([[0., 0., 0.],  

               [0., 0., 0.],

               [0., 0., 0.]])   \\zeros関数とほぼ同じ結果(微妙に違うらしい)

 

 

eye関数(対角行列)

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.]])   \\このような対角数列ができる

 

 

random関数

np.random.randn(3,3)     \\randnとすると標準化された正規分布に従う乱数が生成される

out:array([[-0.60900474,  0.2173376 ,  1.40974499],  \\3✖3としたので3行3列の乱数が生成

               [-2.14412205,  0.30392935, -0.28551067],

               [-0.4954659 , -0.52254514, -0.95222069]])

 

 

行列のインデックス参照

import numpy as np   \\何はともあれnumpyのインポート

arr1 = np.arange(9)   \\9個要素のアレイを作る

arr1           \\内容の確認

out:array([0, 1, 2, 3, 4, 5, 6, 7, 8])

 

arr1[0]   out:0    \\リストと同様に0番目の要素にアクセス

arr1[-1]   out:8    \\8番目の要素にアクセス

arr1[-3]   out:6    \\マイナスを付けると後ろから〇番目の要素にアクセス

 

arr1[1:4]          \\スライス 1番目から4番目の手前までにアクセス

out:array([1, 2, 3])

 

arr1[5:]      \\スライス 5番目から最後までにアクセス

out:array([5, 6, 7, 8])

 

\\2次元のアレイについても確認する

arr2 = np.arange(9).reshape(3,3) \\9要素の行列を3×3にreshape

arr2

out:array([[0, 1, 2],

               [3, 4, 5],

               [6, 7, 8]])

 

arr2[0,0]  out:0 \\0,0と座標を指定して要素を抽出する

arr2[1,2]  out:5  \\1行目の2列目を抽出する

 

arr2[:,1]     \\2次元もスライスが可能 1列目をすべて

out:array([1, 4, 7])   \\1列目が抽出される

 

行列のブールインデックス参照

\\論理式に対して真の値を返す方法

 

arr2 > 4  \\このような論理式を与えると真偽を返してくる

out:array([[False, False, False],

               [False, False,  True],

               [ True,  True,  True]])

 

arr2[arr2 > 4]    \\こうすると

array([5, 6, 7, 8])  \\Trueの値だけを抽出できる

 

ユニバーサル関数

numpyは、すべての要素にまとめて演算するのが得意

forループを回す必要がない。

 

import numpy as np  \\numpyをnpとしてインポート

arr1 = np.arange(9)  \\9個の要素を持つアレイを生成

arr1

out:array([0, 1, 2, 3, 4, 5, 6, 7, 8])

 

arr1 + 1        \\すべての要素に1を足すことができる

out:array([1, 2, 3, 4, 5, 6, 7, 8, 9])

 

arr1 * 3        \\すべての要素に3をかける

out:array([ 0,  3,  6,  9, 12, 15, 18, 21, 24])

 

np.sin(arr1)     \\すべての要素のsinを求める これがユニバーサル関数の一例

out:array([ 0.        ,  0.84147098,  0.90929743,  0.14112001, -0.7568025 ,

       -0.95892427, -0.2794155 ,  0.6569866 ,  0.98935825])

 

np.exp(arr1)     \\別の例 指数関数

out:array([1.00000000e+00, 2.71828183e+00, 7.38905610e+00, 2.00855369e+01,

       5.45981500e+01, 1.48413159e+02, 4.03428793e+02, 1.09663316e+03,

       2.98095799e+03])

 

行列のファイル入出力

元データのbrownian_x.csvというファイルをJupyterを実行しているカレントディレクトリ

に置き、それを読み込んでまたファイル出力するという操作。

 

import numpy as np  \\numpyをnpとしてインポート

arr1 = np.loadtxt("./brownian_x.csv", delimiter=",")  \\arr1に対象のCSVを読込む

 

                    \\カンマ区切りを示す引数

 

#しかしこのように1行目に空欄があり、A2セルから始まるファイルであった場合

ValueError      #ヴァリューエラーとなる

        #これを避けるため、1行目はスキップするという引数を追加する

arr1 = np.loadtxt("./brownian_x.csv", delimiter=",", skiprows=1)

arr1               #このように↓正常に読み込むことができた

out:array([[ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00, ...,

         0.00000000e+00,  0.00000000e+00,  0.00000000e+00],

       [ 1.00000000e+00,  2.66089704e+00,  3.08680751e-01, ...,

 

arr1.shape    #シェイプを確認しておく

out:(501, 101)  #501行、101列のデータであることがわかる

 

np.savetxt("./test.csv", arr1, delimiter=",")  #それをtest.csvとしてカレントディレクトリに出力する

 

行列の評価・操作

import numpy as np  #numpyをnpとしてインポート

 

arr1 = np.arange(10).reshape(5,2) #要素が10個のアレイを生成し、5×2にreshape

arr1

out:array([[0, 1],   #このように生成できた

               [2, 3],

               [4, 5],

               [6, 7],

               [8, 9]])

 

arr1.mean()   #すべての要素の平均値を求める

out: 4.5

 

arr1.mean(axis=0)   #axis=0は列方向の平均値を算出

out: array([4., 5.])

 

arr1.mean(axis=1)   #axis=1は行方向の平均値を算出

out:array([0.5, 2.5, 4.5, 6.5, 8.5])

 

arr1.std()      #通常の標準偏差(nで割る)を求める

out:2.8722813232690143

 

arr1.std(ddof=True)   #不偏標準偏差(n-1で割る)を求める

out:3.0276503540974917

 

arr2 = np.random.randn(100)      #100個の乱数を生成する(平均値0、標準偏差1)

arr2       #このように↓生成された

out:array([-0.63724064, -1.50607387,  0.72104852, -0.90176817,  1.27345502,

        1.79814726, -0.35978692, -0.75626882,  0.30412559, -0.96081212,

 

arr2.max()   #最大値を求める

out:2.3284069871385866

 

arr2.min()   #最小値を求める

out:-2.917981763169857

 

np.sort(arr2)   #ソートする

out:array([-2.91798176, -2.91701024, -2.88600764, -2.204778  , -2.11392631,

       -1.67133112, -1.50607387, -1.4789343 , -1.40344501, -1.38278388,

 

np.where(arr2 > 0, 1, -1)   #正の値なら1、そうでないなら-1とする ソート前の順番で評価

out:array([-1, -1,  1, -1,  1,  1, -1, -1,  1, -1,  1, -1,  1,  1,  1, -1,  1,

        1,  1, -1,  1, -1,  1, -1,  1, -1, -1,  1,  1, -1, -1,  1,  1,  1,

 

np.where(arr2 > 0, True, False)   #こうすればブール値になる

out:array([False, False,  True, False,  True,  True, False, False,  True,

 

np.where(arr2 > 0)   #引数を指定しないと条件に合う値のインデックスを表示する

(array([ 2,  4,  5,  8, 10, 12, 13, 14, 16, 17, 18, 20, 22, 24, 27, 28, 31,

        32, 33, 35, 39, 44, 47, 50, 51, 52, 55, 56, 57, 59, 60, 62, 64, 75,

        76, 77, 80, 81, 83, 85, 86, 87, 93, 96, 98], dtype=int64),)

 

arr2[np.where(arr2 > 0)]   #正の値だけを取ってくる

out:array([0.72104852, 1.27345502, 1.79814726, 0.30412559, 1.89397826,

           0.28587403, 0.18170835, 0.2727221 , 1.66334225, 0.31948912,

 

#重複のあるアレイを作る

arr3 = np.array([1,2,3,2,1,4,5,4,3])

 

np.unique(arr3)   #ユニークな値のみを抽出する

out:array([1, 2, 3, 4, 5])