pythonで高速に数値計算を行うためのモジュールで,デファクト・スタンダードになっている. 他のモジュールもほぼこのNumpyを使うのでこれを知っておく必要がある.
Python Data Science Handbook に詳しくnumpyのことが書かれており,どのように書いたら高速なプログラムが書けるかが分かる. 高速化に関しては numba によるJIT(Just-In-Time)コンパイルという方法がある.これは実用的に知っておいたほうが良い.
配列
基本的にnumpy配列は一度作成したら長さは固定(pythonのリストとは異なるので注意).
配列の形を指定して配列を作成
dtype=float
がデフォルトなので指定する必要はない.dtype=int
にしたいときは必須.
pythonのリストから配列を作成
配列の平均,分散,標準偏差
二次元配列の場合,どの軸に対して平均などを取るか指定する(axis
).
axis=0
は第一引数に関して平均をとり,axis=1
は第二引数に関して平均をとる.ちょっと分かりづらいから注意が必要.
numpy配列に対するif文
numpy配列x
に対して,
このようなことがやりたい場合,つまり,すべての要素が1000以下となるように修正したい場合,配列全体をif文に渡して,
というような文を作ると,配列に対してif文を使えないのでエラーとなる.
このような場合は,numpy.where()
を用いる.
X
は条件が真のときの返り値で,Y
は条件が偽のときの返り値なので,今の場合,
とすれば良い.
例:
numpy.dot
np.dot(A,B)
関数はベクトル間の内積や行列間の積に使えるが,多次元になるとちょっと理解が難しいか?むしろ易しいか?
上のように,左の行列A
の最後のインデックスと,右の行列B
の最後から2つ目のインデックスの間の要素毎の積の和をとって,新たな行列の[i,j,k,m]
要素とする.
なので,ベクトル間の積のときには,
という行列間の積と考えれば分かりやすいのか?