Python 3 エンジニア認定データ分析試験 まとめノート 〜Numpy編〜

python_dataanalysis データサイエンス

Numpy

Pythonのサードパーティ製パッケージ。配列や行列の操作を効率よく行える。
Python標準のリストと一緒でインデックス、スライスが使える。
インデックス:a[0]=a配列の0要素目を指定
スライス:a[1:]=1要素目以降を範囲指定
      b[1,:]=1行目のすべての列を取得
      c[:,[0,2]]=すべての行に対してインデックス値0と2を取得
      e[0:1,[0,2]]=0≦行>1の範囲の行に対してインデックス値0と2を取得
Python標準のリストではスライスした結果はコピー(元の値が書き換わらない)が返されるが、
 Numpyでは参照(元の値が書き換わる)となる。

用語

ndarray:配列用の型

matrix:行列用の型

array():配列の作成

type():オブジェクトの型を確認

shape():配列の形状を確認

reshape():次元の変換
⇒([1,2,3,4,5,6])→([1,2,3],[4,5,6])※要素数が合わないときはエラーとなる

revel():1次元配列に変換。=参照する(浅いコピー)⇒の配列が書き換わる
⇒([1,2,3],[4,5,6])→[0]=7に書き換え→([7,2,3,4,5,6])⇒元の配列も([7,2,3],[4,5,6])となる

flatten():1次元配列に変換。=コピーを返す(深いコピー)⇒元の配列に変化なし
⇒([1,2,3],[4,5,6])→[0]=7に書き換え→([7,2,3,4,5,6])⇒元の配列は([1,2,3],[4,5,6])のまま

.dtype:Numpy配列の要素のデータ型の確認

arange():数列の作成
⇒arange(10)=[0,1,2,3,4,5,6,7,8,9]※0から9までの配列を作成
⇒arange(1,10,3)=[1,2,3,4,5,6,7,8,9]=[1,4,7]※10の1つ前までの数で3つ置きの配列を作る

乱数
np.random.random関数:0〜1の値をランダムに作成
⇒np.random.random((3,2))→行と列をタプルで渡す。0〜1のランダムな値を3✕2行列で作成
np.random.rand関数:0〜1の値をランダムに作成
⇒np.random.rand(3,2)→行と列を引数で渡す。0〜1のランダムな値を3✕2行列で作成
np.random.seed関数:シード値の指定。再現性を担保。実務では固定しないことが求められる。
np.random.randint関数:第一引数以上かつ第二引数未満のランダムな整数値を、第三引数としてタプルで渡した行と列で返す。
⇒np.random.randint(1,10,(3,3))=[[2,6,3][9,4,2][1,0,8]]
np.random.uniform関数:第一引数以上かつ第二引数未満のランダムな小数値を、第三引数としてタプルで渡した行と列で返す。※デフォルトは(0.0,1.0)
⇒np.random.randint(0.0,5.0,size=(2,3))=[[2.64757348,6.23469537,3.74358306][9.23508425,4.80632328,2.72403456]]
np.random.randn関数:行と列を引数で渡す。出力される乱数は標準正規分布(平均0、分散1)に従う
p.random.normal関数:平均、標準偏差、size(形状)を引数として正規分布乱数を取得

eye():単位行列の作成
⇒np.eye(3)=([1,0,0],[0,1,0],[0,0,1])

zeros():引数で指定した要素数の0.0が入った配列を取得
⇒np.zeros(3)=[0.,0.,0.]

ones():引数で指定した要素数の1.0が入った配列を取得
⇒ones(3)=[1.,1.,1.]

nan:Not a Number。データ型はfloatに分類。
⇒np.array([1,2,np.nan])=[1.,2.,nan]

full():指定の値で配列を作成
⇒np.full((1,5),np.e)=1✕5行列[2.71,2.71,2.71,2.71,2.71]
⇒np.full((1,5),np.e).T=5✕1行列[[2.71],[2.71],[2.71],[2.71],[2.71]]
⇒np.full((1,5),np.e).T.revel()=5✕1行列を1元化[2.71,2.71,2.71,2.71,2.71]

linspace():範囲指定で均等割データを作成
⇒np.lispace(0,1,5)=0〜1を5等分する=[0,0.25,0.5,0.75,1]

diff():要素間の差分を返す
⇒l = np.array([4,2,7,7,5])
np.diff(l)=[-2,5,0,-2]※後ー前

concatenate():配列の連結
⇒np.concatenate([1,2,3],[4,5,6])=[1,2,3,4,5,6]
※axis=0:行方向に連結、axis=1:列方向に連結

hstack():配列を連結
⇒np.hstack([1,2,3],[4,5,6])=[1,2,3,4,5,6]

vstack():行方向に配列を連結
⇒np.hstack([1,2,3],[4,5,6])=[[1,2,3],[4,5,6]]

hsplit():列方向に2次元配列を分割
⇒a=[[1,2,8],[4,5,8],[30,60,45]]
first1,second1=np.hsplit(a,[2])
fitst1=[[1,2],[4,5],[30,60]] second1=[[8],[8],[45]]

hsplit():列方向に2次元配列を分割
⇒a=[[1,2,8][4,5,8][30,60,45]]
first,second=np.hsplit(a,[2])
fitst=[[1,2][4,5][30,60]] second=[[8],[8],[45]]

vsplit():列方向に2次元配列を分割
⇒a=[[1,2,8],[4,5,8],[30,60,45]]
first2,second2=np.vsplit(a,[2])
fitst=[[1,2,8],[4,5,8]] second=[[30,60,45]]

.T:転置(行と列を入れ替える)
⇒a=[[1,2,3],[4,5,6]]
 a.T=[[1,4],[2,5],[3,6]]

newaxis:次元追加
⇒a=[1,2,3]
a[np.newaxis,:]=[[1,2,3]]※行方向に追加
a[:,np.newaxis]=[[1],[2],[3]]※列方向に追加(変換)

meshgrid():グリッドデータの生成
⇒m=np.arange(0,4)=[0,1,2,3]
n=np.arange(4,7)=[4,5,6]
xx,yy=np.meshgrid(m,n)
xx=[[0,1,2,3],[0,1,2,3],[0,1,2,3]]※m列n行
  yy=[[4,4,4,4],[5,5,5,5],[6,6,6,6]]※m列n行、nをm列分にする

ブロードキャスト:配列の内部データに直接演算を行う
⇒a=np.array[0,9,99,999]
 a=a+1→a=[1,10,100,1000]
 a=a*100→a=[100,1000,10000,100000]

ユニバーサルファンクション:配列の要素内のデータを一括変換
⇒b=np.log10(a)→b=[log10(100),log10(1000),log10(10000),log10(100000)]=[2,3,4,5]
abs():絶対値を返す
sin()
:sin関数の計算結果を取得
cos()
:cos関数の計算結果を取得
log()
:ネイピア数を底とする自然対数 log関数の計算結果を取得
log10()
:10を底とする常用対数log10関数の計算結果を取得
exp():指数関数e^xの計算結果を取得※↔log()

ドット積:2つの同じ長さの数列から一つの数値を返す演算。@演算子 or dot()matmul()を使用
⇒[1,3]@[-1,5]=1*-1+3*5=14
⇒np.dot([[1,2],[3,4]],[1,3])=[1*1+2*3,3*1+4*3]=[7,15]
⇒「2✕3行列@3✕1行列(3要素の1次元データ)」→計算可能
[[-3,-2,-1][0,1,2]]@[0,1,2]=[-3*0+-2*1+-1*2,0*0+1*1+2*2]=[-4,5]
⇒「3✕1行列(3要素の1次元データ)@2✕3行列」→計算不可(エラー)
[0,1,2]@[[-3,-2,-1][0,1,2]]=ValueError
⇒「2✕3行列@3✕2行列」→計算可能
[[-3,-2,-1][0,1,2]]@[[0,1],[2,3],[4,5]]=[[-3*0+-2*2+-1*4,-3*1+-2*3+-1*5],[0*0+1*2+2*4,0*1+1*3+2*5]]=[[-8,-14],[10,13]]
⇒「3✕2行列@2✕3行列」→計算可能
[[0,1],[2,3],[4,5]]@[[-3,-2,-1][0,1,2]]=[[0*-3+1*0,0*-2+1*1,0*-1+1*2],[2*-3+3*0,2*-2,3*1,2*-1+3*2],[4*-3+5*0,4*-2+5*1,4*-1+5*2]]=[[0,1,2],[-6,-1,4],[-12,-3,6]]

アダマール積
multiply():行列同士の積(アダマール積)

判定
⇒a=[0,1,2]、b=[[-3,-2,-1],[0,1,2]]、c=[[1,2,3],[4,5,6]]
a>1=[False,False,True]
np.count_nonzero(a>0)=2:Trueの数をカウント※=np.sum(b>0)
 np.any(a>0)=True:Trueが含まれているかどうかの判定
 np.all(a>0)=False:すべてTrueかどうかの判定
 np.allcolse(b,c)=False:配列同士が同じ要素で構成されているか判定
 np.allcolse(b,c,atol=10)=True:誤差10で配列同士が同じ要素で構成されているか判定
 ・ビット演算
  b[(b==c)|(a==b)]→[(b==c)|(a==b)]=[[False,False,False],[True,True,True]]→b[2,:]=[0,1,2]

関数とメソッド
 np.sum(a)=a.sum()

コメント

タイトルとURLをコピーしました