Python の SciPy チュートリアル: とは、ライブラリ、関数、例

Python の SciPy

Python の SciPy は、数学、科学、工学、技術的な問題を解決するために使用されるオープンソース ライブラリです。 これにより、ユーザーは幅広い高レベルの Python コマンドを使用してデータを操作し、データを視覚化できます。 SciPy は Python NumPy 拡張機能に基づいて構築されています。 SciPy は「ため息パイ」とも発音されます。

SciPy のサブパッケージ:

SciPyを使用する理由

  • SciPy には、科学計算に関連する最も一般的な問題の解決に役立つさまざまなサブパッケージが含まれています。
  • Python の SciPy パッケージは、C/C++ または Matlab 用の GNU Scientific Library に次いで最も使用されている Scientific ライブラリです。
  • 使いやすく理解しやすいだけでなく、高速な計算能力も備えています。
  • NumPy ライブラリの配列を操作できます。

Numpy VS SciPy

ナンシー

  • Numpy は C で書かれており、数学的または数値計算に使用されます。
  • 他の Python ライブラリよりも高速です
  • Numpy は、データ サイエンスが基本的な計算を実行するために最も便利なライブラリです。
  • Numpy には、並べ替え、整形、インデックス付けなどの最も基本的な操作を実行する配列データ型のみが含まれています。

SciPy

  • SciPy は NumPy の上に組み込まれています
  • Python の SciPy モジュールは線形代数のフル機能バージョンですが、Numpy にはいくつかの機能しか含まれていません。
  • 新しいデータ サイエンス機能のほとんどは、Numpy ではなく Scipy で利用できます。

SciPy – インストールと環境セットアップ

SciPy をインストールすることもできます Windows ピップ経由

Python3 -m pip install --user numpy scipy 

Linux に Scipy をインストールする

sudo apt-get install  python-scipy python-numpy

Mac に SciPy をインストールする

sudo port install py35-scipy py35-numpy

SciPy Python の学習を始める前に、基本的な機能とさまざまなタイプの配列について理解しておく必要があります。 NumPy

SciPy モジュールと Numpy をインポートする標準的な方法:

from scipy import special   #same for other modules
import numpy as np

ファイル入出力パッケージ

I/O パッケージである Scipy には、Matlab、Arff、Wave、Matrix Market、IDL、NetCDF、TXT、CSV、バイナリ形式などのさまざまなファイル形式を処理するための幅広い機能があります。

MatLab で定期的に使用される Python SciPy のファイル形式の例を XNUMX つ取り上げてみましょう。

 import numpy as np
 from scipy import io as sio
 array = np.ones((4, 4))
 sio.savemat('example.mat', {'ar': array}) 
 data = sio.loadmat(‘example.mat', struct_as_record=True)
 data['ar']

出力:

array([[ 1., 1., 1., 1.],
           [ 1., 1., 1., 1.],
           [ 1., 1., 1., 1.],
           [ 1., 1., 1., 1.]])

コードの説明

  • 1行目と2行目: I/O パッケージと Numpy を使用して、Python で重要な SciPy ライブラリをインポートします。
  • ライン3: 4 x 4 次元の XNUMX の配列を作成します
  • ライン4: 配列を格納する場所 たとえば .mat ファイルにソフトウェアを指定する必要があります。
  • ライン5: データの取得元 たとえば .mat file
  • ライン6: 印刷出力。

特殊機能パッケージ

  • scipy.special パッケージには数理物理学の多数の関数が含まれています。
  • SciPy の特殊関数には、XNUMX 次ルート、指数関数、対数和指数、ランバート、順列と組み合わせ、ガンマ、ベッセル、超幾何、ケルビン、ベータ、放物線円柱、相対誤差指数などが含まれます。
  • これらすべての関数を XNUMX 行で説明するには、Python コンソールに次のように入力します。
help(scipy.special)	
Output:
NAME
    scipy.special

DESCRIPTION
    ========================================
    Special functions (:mod:`scipy.special`)
    ========================================
     
    .. module:: scipy.special
     
    Nearly all of the functions below are universal functions and follow
    broadcasting and automatic array-looping rules. Exceptions are noted.

立方根関数

Cubic Root 関数は値の立方根を求めます。

構文:

scipy.special.cbrt(x)

例:

from scipy.special import cbrt
#Find cubic root of 27 & 64 using cbrt() function
cb = cbrt([27, 64])
#print value of cb
print(cb)

出力: 配列([3., 4.])

指数関数:

指数関数は 10**x 要素を計算します。wise.

例:

from scipy.special import exp10
#define exp10 function and pass value in its
exp = exp10([1,10])
print(exp)

出力: [1.e+01 1.e+10]

順列と組み合わせ

SciPy は、順列と組み合わせを計算する機能も提供します。

組み合わせ– scipy.special.comb(N,k)

例:

from scipy.special import comb
#find combinations of 5, 2 values using comb(N, k)
com = comb(5, 2, exact = False, repetition=True)
print(com)

出力: 15.0

順列 –

scipy.special.perm(N,k)

例:

from scipy.special import perm
#find permutation of 5, 2 using perm (N, k) function
per = perm(5, 2, exact = True)
print(per)

出力: 20

対数和指数関数

Log Sum Exponential は、合計指数入力要素の対数を計算します。

構文:

scipy.special.logsumexp(x) 

ベッセル関数

N次整数演算関数

構文:

scipy.special.jn()

SciPy による線形代数

  • SciPy の線形代数は、BLAS および ATLAS LAPACK ライブラリの実装です。
  • 線形代数のパフォーマンスは、BLAS や LAPACK と比較して非常に高速です。
  • 線形代数ルーチンは XNUMX 次元配列オブジェクトを受け入れ、出力も XNUMX 次元配列になります。

では、いくつかのテストを行ってみましょう scipy.linalg、

計算する 行列式 二次元行列の、

from scipy import linalg
import numpy as np
#define square matrix
two_d_array = np.array([ [4,5], [3,2] ])
#pass values to det() function
linalg.det( two_d_array )

出力: -7.0

逆行列 –

scipy.linalg.inv()

Scipy の逆行列は、任意の正方行列の逆行列を計算します。

どれどれ、

from scipy import linalg
import numpy as np
# define square matrix
two_d_array = np.array([ [4,5], [3,2] ])
#pass value to function inv()
linalg.inv( two_d_array )

出力:

array( [[-0.28571429,  0.71428571],
       [ 0.42857143, -0.57142857]] )

固有値と固有ベクトル

scipy.linalg.eig()

  • 線形代数で最も一般的な問題は固有値と固有ベクトルであり、次を使用して簡単に解決できます。 eig()機能。
  • 次に、() の固有値を求めてみましょう。X) と XNUMX 次元正方行列の固有ベクトルに対応します。

from scipy import linalg
import numpy as np
#define two dimensional array
arr = np.array([[5,4],[6,3]])
#pass value into function
eg_val, eg_vect = linalg.eig(arr)
#get eigenvalues
print(eg_val)
#get eigenvectors
print(eg_vect)

出力:

[ 9.+0.j -1.+0.j] #eigenvalues
 [ [ 0.70710678 -0.5547002 ] #eigenvectors
   [ 0.70710678  0.83205029] ]

離散フーリエ変換 – scipy.fftpack

  • DFT は、空間データを周波数データに変換する際に使用される数学的手法です。
  • FFT (高速フーリエ変換) は DFT を計算するためのアルゴリズムです
  • FFT は多次元配列に適用されます。
  • 周波数は、特定の期間における信号または波長の数を定義します。

例: 波を取得し、Matplotlib ライブラリを使用して表示します。 sin(20 × 2πt) の単純な周期関数の例を取り上げます。

%matplotlib inline
from matplotlib import pyplot as plt
import numpy as np 

#Frequency in terms of Hertz
fre  = 5 
#Sample rate
fre_samp = 50
t = np.linspace(0, 2, 2 * fre_samp, endpoint = False )
a = np.sin(fre  * 2 * np.pi * t)
figure, axis = plt.subplots()
axis.plot(t, a)
axis.set_xlabel ('Time (s)')
axis.set_ylabel ('Signal amplitude')
plt.show()

出力:

離散フーリエ変換

これを見るとわかります。 周波数は 5 Hz で、その信号は 1/5 秒で繰り返されます。これは特定の期間として呼び出されます。

ここで、DFT アプリケーションを利用してこの正弦波を使用してみましょう。

from scipy import fftpack

A = fftpack.fft(a)
frequency = fftpack.fftfreq(len(a)) * fre_samp
figure, axis = plt.subplots()

axis.stem(frequency, np.abs(A))
axis.set_xlabel('Frequency in Hz')
axis.set_ylabel('Frequency Spectrum Magnitude')
axis.set_xlim(-fre_samp / 2, fre_samp/ 2)
axis.set_ylim(-5, 110)
plt.show()

出力:

離散フーリエ変換

  • 出力が XNUMX 次元配列であることが明確にわかります。
  • comを含む入力plex 値は XNUMX 点を除いてゼロです。
  • DFT の例では、信号の大きさを視覚化します。

SciPy での最適化と適合 – scipy.optimize

  • 最適化は、曲線フィッティング、多次元またはスカラーおよびルート フィッティングの最小化に役立つアルゴリズムを提供します。
  • の例を見てみましょう スカラー関数、最小のスカラー関数を見つけます。
%matplotlib inline
import matplotlib.pyplot as plt
from scipy import optimize
import numpy as np

def function(a):
       return   a*2 + 20 * np.sin(a)
plt.plot(a, function(a))
plt.show()
#use BFGS algorithm for optimization
optimize.fmin_bfgs(function, 0) 

出力:

SciPy での最適化と適合

最適化は正常に終了しました。

現在の関数値: -23.241676

反復: 4

関数評価: 18

勾配評価: 6

配列([-1.67096375])

  • この例では、最適化は初期点からの勾配降下法アルゴリズムを利用して行われます。
  • しかし、考えられる問題は、グローバル最小値ではなくローカル最小値です。 大域的最小値の近傍が見つからない場合は、大域的最適化を適用し、次のように使用される大域的最小値関数を見つける必要があります。 盆地ホッピング() ローカルオプティマイザーを組み合わせたものです。

optimize.basinhopping(関数, 0)

出力:

fun: -23.241676238045315
 lowest_optimization_result:
      fun: -23.241676238045315
 hess_inv: array([[0.05023331]])
      jac: array([4.76837158e-07])
  message: 'Optimization terminated successfully.'
     nfev: 15
      nit: 3
     njev: 5
   status: 0
  success: True
        x: array([-1.67096375])
                    message: ['requested number of basinhopping iterations completed successfully']
      minimization_failures: 0
                       nfev: 1530
                        nit: 100
                       njev: 510
               x: array([-1.67096375])

ネルダー・ミードアルゴリズム:

  • Nelder-Mead アルゴリズムはメソッド パラメータを通じて選択します。
  • これは、公正に動作する関数を最小化する最も簡単な方法を提供します。
  • Nelder – Mead アルゴリズムは、解を見つけるのに時間がかかる可能性があるため、勾配評価には使用されません。
import numpy as np
from scipy.optimize import minimize
#define function f(x)
def f(x):   
    return .4*(1 - x[0])**2
  
optimize.minimize(f, [2, -1], method="Nelder-Mead")

出力:

final_simplex: (array([[ 1.        , -1.27109375],
       [ 1.        , -1.27118835],
       [ 1.        , -1.27113762]]), array([0., 0., 0.]))
           fun: 0.0
       message: 'Optimization terminated successfully.'
          nfev: 147
           nit: 69
        status: 0
       success: True
             x: array([ 1.        , -1.27109375])

SciPy による画像処理 – scipy.ndimage

  • scipy.ndimage は SciPy のサブモジュールで、主に画像関連の操作を実行するために使用されます。
  • ndimage は「n」次元の画像を意味します。
  • SciPy 画像処理は、幾何学変換 (回転、クロップ、反転)、画像フィルタリング (シャープおよびデノージング)、画像表示、画像セグメンテーション、分類および特徴抽出を提供します。
  • その他のパッケージ SciPy には、画像操作タスクの実行に使用できる事前構築済みの画像が含まれています

例: 画像の幾何学的変換の例を見てみましょう

from scipy import misc
from matplotlib import pyplot as plt
import numpy as np
#get face image of panda from misc package
panda = misc.face()
#plot or show image of face
plt.imshow( panda )
plt.show()

出力:

SciPyによる画像処理

ここで私たちは フリップダウン 現在の画像:

#Flip Down using scipy misc.face image  
flip_down = np.flipud(misc.face())
plt.imshow(flip_down)
plt.show()

出力:

SciPyによる画像処理

例: Scipyを使用した画像の回転、

from scipy import ndimage, misc
from matplotlib import pyplot as plt
panda = misc.face()
#rotatation function of scipy for image – image rotated 135 degree
panda_rotate = ndimage.rotate(panda, 135)
plt.imshow(panda_rotate)
plt.show()

出力:

SciPyによる画像処理

Scipy との統合 – 数値積分

  • 解析的に積分できない関数を積分するときは、数値積分に頼る必要があります。
  • SciPy は、関数と数値積分を統合する機能を提供します。
  • scipy.統合 ライブラリには単一の統合があり、 double、トリプル、マルチプル、ガウス四角形、ロンベルグ、台形、シンプソンの法則。

例: ここで例を挙げてみましょう 単一の統合

Scipyとの統合

ここに a は上限であり、 b 下限です

from scipy import integrate
# take f(x) function as f
f = lambda x : x**2
#single integration with a = 0 & b = 1  
integration = integrate.quad(f, 0 , 1)
print(integration)

出力:

(0.33333333333333337、3.700743415417189e-15)

ここで、関数は XNUMX つの値を返します。最初の値は積分で、XNUMX 番目の値は積分の推定誤差です。

例: SciPy の例を見てみましょう。 double 統合。 私たちは見つけます double フォローの統合wing 方程式、

Scipyとの統合

from scipy import integrate
import numpy as np
#import square root function from math lib
from math import sqrt
# set  fuction f(x)
f = lambda x, y : 64 *x*y
# lower limit of second integral
p = lambda x : 0
# upper limit of first integral
q = lambda y : sqrt(1 - 2*y**2)
# perform double integration
integration = integrate.dblquad(f , 0 , 2/4,  p, q)
print(integration)

出力:

(3.0、9.657432734515774e-14)

上記の出力が以前のものと同じであることが分かりました。

まとめ

  • SciPy (「サイ パイ」と発音) は、オープンソースの Python ベースのライブラリであり、数学、科学技術コンピューティング、エンジニアリング、および技術コンピューティングで使用されます。
  • SciPy には、科学計算に関連する最も一般的な問題の解決に役立つさまざまなサブパッケージが含まれています。
  • SciPy は NumPy の上に組み込まれています
パッケージ名称 Description
scipy.io ファイル入出力
scipy.special 特殊機能
scipy.linalg 線形代数演算
scipy.補間 補間
scipy.最適化 最適化とフィット
scipy.stats 統計と乱数
scipy.統合 数値積分
scipy.fftpack 高速フーリエ変換
scipy.シグナル 信号処理
scipy.ndimage 画像操作 –