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]) \\要素と要素が足されている
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列とわかる
\\エーレンジ関数と読む
arr4 = np.arange(10)
//10個の要素の数列を作る
arr4
out:array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) //0~9までの10個の要素の数列を作った
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次元になる
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.]])
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列で行列が作れた
np.empty([3,3]) \\emptyが3行3列
out:array([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]]) \\zeros関数とほぼ同じ結果(微妙に違うらしい)
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.]]) \\このような対角数列ができる
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])