【Python入門】科学計算に役立つライブラリ(numpy)- Python初心者勉強記031
今回は科学計算に役立つライブラリであるnumpyの使い方を詳しく見ていきます。
numpy
numpyはpythonの中で科学計算を行う際に使用するライブラリです。
numpyのインストール
pipを使って簡単にインストールすることができます。
python -m pip install numpy
numpyモジュールをimportして使用します。npという名前をつけるのが慣例のようです。
>>> import numpy as np
配列の作成
それでは、実際にnumpyで配列を作っていきましょう。
>>> a = np.array([1,2])
>>> a
array([1, 2])
>>> a.ndim #aの次元数
1
>>> a.size #aの要素数
2
>>> a.shape #各次元の要素数(行,列)
(2,)
>>> a.dtype #aのデータ型
dtype('int64')
numpyのデータ型には、boolean(論理型),int(符号付き整数型),uint(符号無し整数型),浮動float(小数点型),complex(複素数型)などがあります。
データ型を指定して配列をつくるには以下のようにします。
>>> b = np.array([[1,2],[3,4],[5,6]],dtype=np.float32)
>>> b
array([[ 1., 2.],
[ 3., 4.],
[ 5., 6.]], dtype=float32)
>>> b.shape
(3, 2)
型をキャストするにはastype()を使います。astype()は新しい別の配列を作成して返します。
>>> b.astype(np.int64)
array([[1, 2],
[3, 4],
[5, 6]])
>>> b
array([[ 1., 2.],
[ 3., 4.],
[ 5., 6.]], dtype=float32)
その他の配列の作成方法
numpyには便利な配列作成方法がたくさんあります。一部を見ていきましょう。
## 要素が全て0.の配列を作成
>>> a=np.zeros([3,2])
>>> a
array([[ 0., 0.],
[ 0., 0.],
[ 0., 0.]])
## 要素が全て1.の配列を作成
>>> a=np.ones([3,2])
>>> a
array([[ 1., 1.],
[ 1., 1.],
[ 1., 1.]])
## 単位行列の作成
>>> a=np.identity(2)
>>> a
array([[ 1., 0.],
[ 0., 1.]])
>>> a=np.identity(3)
>>> a
array([[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.]])
## 単位行列の作成(列数指定あり)
>>> np.eye(4,2)
array([[ 1., 0.],
[ 0., 1.],
[ 0., 0.],
[ 0., 0.]])
## 組込み関数のrange()と同じような作成方法
>>> np.arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.arange(2,8,2)
array([2, 4, 6])
## 線形に等間隔なベクトルを作成 linspace(始点,終点,要素数)
>>> np.linspace(0,4,6)
array([ 0. , 0.8, 1.6, 2.4, 3.2, 4. ])
##縦横に等間隔な格子状配列
>>> x,y = np.meshgrid([1,2,3],[4,5,6,7])
>>> x
array([[1, 2, 3],
[1, 2, 3],
[1, 2, 3],
[1, 2, 3]])
>>> y
array([[4, 4, 4],
[5, 5, 5],
[6, 6, 6],
[7, 7, 7]])
配列要素の参照・代入
numpyの配列要素の参照・代入はPythonのリストと同じです。
>>> x=np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> x
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> x[0][1]
2
>>> x[0][1]=10
>>> x
array([[ 1, 10, 3],
[ 4, 5, 6],
[ 7, 8, 9]])
>>> x[1:3,0:2]
array([[4, 5],
[7, 8]])
配列の形状変更
numpyの配列はreshapeなどの関数を使うことで、形状を変更することができます。
reshapeは元のデータの参照を返します。よって参照内のデータを変更すると元のデータも変更されます。
>>> a = np.arange(8)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7])
## reshapeにより、形状変更。aの参照が返される
>>> b = a.reshape(2,4)
>>> b
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
>>> b[0][1] = 10
>>> b
array([[ 0, 10, 2, 3],
[ 4, 5, 6, 7]])
## bのデータを変更するとaのデータも変更される
>>> a
array([ 0, 10, 2, 3, 4, 5, 6, 7])
resizeを用いると参照は返されません。
>>> a=np.arange(8)
>>> a.resize(2,4)
>>> a
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
>>> b=a.resize(2,4)
>>> b
##何も返されていない
transposeを使うと配列の転置や並び替えができます。
>>> a = np.array([[[1,2],[1,2],[1,2],[1,2]],[[3,4],[3,4],[3,4],[3,4]],[[5,6],[5,6],[5,6],[5,6]]])
>>> a
array([[[1, 2],
[1, 2],
[1, 2],
[1, 2]],
[[3, 4],
[3, 4],
[3, 4],
[3, 4]],
[[5, 6],
[5, 6],
[5, 6],
[5, 6]]])
>>> a.shape
(3, 4, 2)
>>> a.transpose(0,2,1)
array([[[1, 1, 1, 1],
[2, 2, 2, 2]],
[[3, 3, 3, 3],
[4, 4, 4, 4]],
[[5, 5, 5, 5],
[6, 6, 6, 6]]])
## (3,2,4)の形に変換される
>>> a.transpose(1,2,0)
array([[[1, 3, 5],
[2, 4, 6]],
[[1, 3, 5],
[2, 4, 6]],
[[1, 3, 5],
[2, 4, 6]],
[[1, 3, 5],
[2, 4, 6]]])
## (4,2,3)の形に変換される
配列要素への演算
配列要素に対する演算のやり方は以下の通りです。
>>> a = np.array([1,2,3])
>>> b = np.array([4,5,6])
>>> a+b
array([5, 7, 9])
>>> a-b
array([-3, -3, -3])
>>> a*b
array([ 4, 10, 18])
>>> a/b
array([ 0.25, 0.4 , 0.5 ])
>>> a%b
array([1, 2, 3])
>>> a**b
array([ 1, 32, 729])
行列演算
行列に関する演算を見ていきましょう。
>>> a = np.array([1,2,3])
>>> b = np.array([4,5,6])
## 内積
>>> np.dot(a,b)
32
##外積
>>> np.cross(a,b)
array([-3, 6, -3])
>>> x = np.array([[1,2],[3,4]])
>>> x
array([[1, 2],
[3, 4]])
## 行列式
>>> np.linalg.det(x)
-2.0000000000000004
## 逆行列
>>> np.linalg.inv(x)
array([[-2. , 1. ],
[ 1.5, -0.5]])
## 固有値と固有ベクトルを求める
>>> la, v = np.linalg.eig(x)
>>> la,v
(array([-0.37228132, 5.37228132]), array([[-0.82456484, -0.41597356],
[ 0.56576746, -0.90937671]]))
## 固有値 -0.37228132 に対する固有ベクトル[-0.82456484, -0.41597356]
## 固有値 5.37228132 に対する固有ベクトル[ 0.56576746, -0.90937671]
ファイル入出力
ファイル入出力も簡単に行うことができます。
>>> a
array([1, 2, 3])
## テキスト形式で保存、テキスト形式のファイルをロード
>>> np.savetxt('test1.txt',a)
>>> np.loadtxt('test1.txt')
array([ 1., 2., 3.])
## 区切り文字の指定もできる
>>> np.savetxt('test1.txt',a,delimiter=' ')
## バイナリ形式で保存、バイナリ形式のファイルをロード 拡張子は.npyになる
>>> np.save('test2',a)
>>> np.load('test2.npy')
array([1, 2, 3])
np.savez(ファイル名,キーワード)で複数の配列を一つのファイルに保存することができます。(ファイルの拡張子は.npzになる)
キーワードに保存したい配列を指定します。
>>> a
array([1, 2, 3])
>>> b
array([4, 5, 6])
>>> x
array([[1, 2],
[3, 4]])
## キーワードを指定して3つの配列を保存
>>> np.savez('test.npz',a=a,b=b,x=x)
>>> nd3 = np.load('test.npz')
## キーワードを用いて配列を取り出すことができる
>>> nd3['a']
array([1, 2, 3])
>>> nd3['x']
array([[1, 2],
[3, 4]])