ロゴ

プログラミング初心者がアプリ開発を目指すブログ

【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]])

スポンサード リンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA