はじめに

PythonにはSciPy・NumPy・Pandasなど多彩なライブラリが存在します。

ライブラリの使用をマスターすると画像の編集やWEBページの解析、微積分の計算など様々な内容をおこなうことが可能です。

今回は計算をおこなう際に便利なSciPyを中心に、他ライブラリとの違いなども紹介していきます。


SciPyとは

SciPyとは高度な科学技術計算をおこなうことが可能なライブラリで、サイパイと読みます。

高校数学で習う微積分や統計で使われる標準偏差などの計算をおこなうことが可能なライブラリです。

科学技術計算の他にも機械学習やデータ分析など様々な分野で利用されています。


NumPyとは

NumPyはPythonの主流なライブラリの一つで、ナムパイと読みます。

Python単体で計算をおこなうより簡単に、かつ素早く計算を実行することが可能です。

NumPyもSciPyと同じように、機械学習やデータ分析を中心に様々な分野で利用されています。


Pandasとは

Pandasはパンダスと読み、データ分析を効率良くおこなうためのライブラリです。

データの読み込みやデータの修正などを効率的におこなうことが可能です。

SciPyやNumPyと共に、Pythonでおこなうデータ分析によく利用されています。


SciPyとNumPyの違い

SciPyとNumPyは、提供されている機能が似ているため使い分けに迷う可能性があります。

どちらも計算を便利におこなうことが可能なツールですが、細かくは以下のような違いがあります。

NumPyはSciPyと比べると機能がコンパクトですが、NumPyのみですべての機能を扱うことが可能です。

SciPyはサブパッケージを個別にimportする必要がありますが、NumPyより多くの機能を扱うことが可能です。


SciPyのサブパッケージについて

SciPyに存在するすべてのサブパッケージを紹介するのは難しいですが、代表的なものを紹介します。

なお、サブパッケージを使用する際は「from scipy import subpackage(サブパッケージの名前)」でおこなうことが可能です。

  • 「constants」: 物理定数と変換係数(バージョン0.7.0以降)
  • 「cluster」: 階層的クラスタリング、ベクトル量子化、K平均
  • 「fftpack」: 離散フーリエ変換アルゴリズム
  • 「integrate」: 数値積分ルーチン
  • 「interpolate」: 補間ツール
  • 「io」: データ入出力
  • 「linalg」: 線形代数ルーチン
  • 「misc」: その他のユーティリティ(例:画像の読み書き)
  • 「ndimage」: 多次元画像処理のためのさまざまな機能
  • 「optimize」: 線形計画法を含む最適化アルゴリズム
  • 「signal」: 信号処理ツール
  • 「sparse」: スパース行列と関連アルゴリズム
  • 「spatial」: KD木、最近傍、距離関数
  • 「special」:特別な機能
  • 「stats」: 統計関数
  • 「weave」:C / C ++コードをPythonの複数行の文字列として書くためのツール


SciPy利用の準備

基本的な違いを学んだ上で、ここからはSciPyを使用するための準備をおこないます。

SciPyを使用するには、まずライブラリをインストールする必要があります。


Pythonバージョンの確認

使用しているPythonのバージョンで使用するコマンドが変わるため注意が必要です。

まだPythonをインストールしていない場合は、事前にインストールする必要があります。

Python3以外を使用している場合は、記事に記載されているコマンドの「Python3」部分を使用しているバージョンに置き換えて下さい。

もし今のバージョンが分からない場合は「python –version」または「python3 –version」で確認してください。


SciPyのインストール

SciPyのインストールは「python -m pip install scipy」を実行することで可能です。

うまくインストールが出来ない場合はpipのバージョンが古い可能性があるため、「python3 -m pip install –upgrade pip」でpipのバージョンを上げる必要があります。

pipをアップデートしたあとは、再度インストールのコマンドを実行します。

正しくインストールが出来た場合は「pip list」を実行した際にSciPyが表示されることで確認が可能です。

  1. Package Version
  2. ——————-
  3. future 0.17.0
  4. pip 18.2
  5. setuptools 39.3.0
  6. six 1.12.0
  7. wheel 0.31.2
  8. scipy 1.8.1


IPythonのインストール

SciPyをインストール出来たら、次はIPythonをインストールします。

IPythonはPythonの機能を拡張したようなものです。

入力補完機能があるためTABキーを押下することでコマンドの入力支援をおこなってくれます。

SciPyのインストールと同様に「python -m pip install ipython」を実行するとインストールが可能です。

IPythonと類似したツールで、Jupyter Notebookというツールも存在します。

このツールも、実行結果を記録することが出来るためPython単体よりも使い勝手が良く学習に便利です。

実行結果を記録し、再度同じコマンドを実行するなど、状況に応じて使い分けると効率が上がります。


IPythonの使い方やJupyterとの違いについては、以下の記事で詳しく解説しています。ぜひ併せてご参照ください。

関連記事:【IPython入門】の使い方を徹底解説!IPythonでできることとは?Jupyterとの比較も紹介


SciPyで様々な計算を実行する

SciPyの準備が完了したら、実際にSciPyを利用した様々な機能を紹介します。

Pythonで「ipython」と入力するとIPythonを起動することが可能です。

Jupyter Notebookを使用する場合は「jupyter notebook」と入力すると同様に起動します。


定積分の計算をおこなう

SciPyを使用すると、定積分(積分)の計算を簡単におこなうことが可能です。

積分をおこなう際は、SciPyモジュールのquad()を使用します。

例えば、y=cos^2x(0→π)の積分をSciPyで実施する時は以下のコマンドを実施します。

「import scipy as sp」(asの後に任意の名前を入力しておくと、省略した形でライブラリを読み出すことが出来るため便利です)

  1. 「from scipy import integrate」
  2. 「y = lambda x: sp.cos(x)**2」
  3. 「ie = integrate.quad(y, 0, sp.pi)」
  4. 「print(ie)」

コマンド実施後に(1.5707963267948966, 1.743934249004316e-14)が返ってくれば成功です。

なお、表示される計算結果に無理数(πなど)を含む場合は、正確に計算をおこなうことが出来ないため誤差が生じます。

この場合は実際の答えはπ/2となり無理数を含むため、小数点を含んだ計算結果が表示されています。

正しく計算されているか不安な場合は答えがπになるような定積分をおこなうことで、計算結果が正しく表示されていることの確認が可能です。

4/1+x^2(0→1)に積分を以下のコマンドでおこないます。

  1. 「import scipy as sp」
  2. 「from scipy import integrate」
  3. 「def f(x):」
  4. 「 return 4/(1+x**2)」
  5. 「ie = integrate.quad(f, 0, 1)」
  6. 「print(ie)」

実施後に計算結果(3.1415926535897936, 3.4878684980086326e-14)が返ってくれば成功です。

円周率と似たような値が返ってきていることで計算結果がπと表示されていることが分かります。


三角関数の計算をおこなう

SciPyではsp.sin・sp.cos・sp.tanを使ってそれぞれの値を求めることが可能です。

それぞれのコマンドの後に角度を指定することで、値が出力されます。

例として、sin0・cos90・tan90を以下のコマンドで求めましょう。

  1. 「import scipy as sp」
  2. 「sp.sin(90)」
  3. 「sp.cos(0)」
  4. 「sp.tan(0)」

それぞれの出力結果が「0」「1」「0」と表示されることが確認できます。

また、sin・cos・tanを使って三角形の角度を求めることも可能です。

試しに斜辺が2、底辺が1、高さが√3の直角三角形の角度tanθをSciPyを用いて求めます。

  1. 「import scipy as sp」
  2. 「radian = round(sp.degrees(np.arctan2(np.sqrt(3),1)))」
  3. 「print(radian)」

コマンド実施後に計算結果(60.0)が返ってくれば成功です。

角度や値の計算の他に、SciPyでは三角関数のグラフを作成することも可能です。

  1. 「import scipy as sp」
  2. 「import matplotlib.pyplot as plt」
  3. 「sample = sp.linspace(-sp.pi, sp.pi)」
  4. 「plt.plot(x, sp.sin(x), color=‘r’, ls=‘-‘, label=‘sin’)」
  5. 「plt.xlim(-sp.pi, sp.pi)」
  6. 「plt.ylim(-1.2, 1.2)」
  7. 「plt.axhline(0, ls=‘-‘, c=‘b’, lw=0.5)」
  8. 「plt.axvline(0, ls=‘-‘, c=‘b’, lw=0.5)」
  9. 「plt.legend()」
  10. 「plt.xlabel(‘x’)」
  11. 「plt.ylabel(‘y’)」
  12. 「plt.title(‘SampleGraph’)」

ここまで入力をした後、最後に「plt.show()」と入力すればsinの関数グラフが表示されます。

コマンドでは、sinの表示とグラフ表示の方法を指定しています。


リストを作成する

SciPyでは統計によく使われる合計や平均、標準偏差などの計算を簡単におこなうことが可能です。

統計の計算をおこなう際は、事前にリストの作成をおこなうことが必要です。

リストの作成は「list(任意の名前) = [1,2,3,4,5(任意の数字)]」でおこなうことが出来ます。

リストには文字を入力することも可能ですが数字以外の値が含まれると計算がうまく出来なくなります。


リストの合計値を求める

あらかじめ作成しておいたリストを使用することで、リスト内の数字の合計値を計算することが可能です。

1から10までの合計値を計算する際は、以下のコマンドを実行します。

  1. 「import scipy as sp」
  2. 「list = [1,2,3,4,5,6,7,8,9,10]」
  3. 「sp.sum(list)」

コマンド実施後に計算結果(55)が返ってくれば成功です。


リストの平均値を求める

合計値を求める際に使用したsumをmeanに置き換えると、平均値を求めることが出来ます。

  1. 「import scipy as sp」
  2. 「list = [1,2,3,4,5,6,7,8,9,10]」
  3. 「sp.mean(list)」

コマンド実施後に計算結果(5.5)が返ってくれば成功です。


リストの標準偏差を求める

標準偏差を求める際、本来であれば分散を求めないといけませんがSciPyでは不要です。

SciPyでは以下のコマンドを実行するだけで標準偏差を求めることができます。

  1. 「import scipy as sp」
  2. 「list = [1,2,3,4,5,6,7,8,9,10]」
  3. 「sp.std(list, ddof = 0)」

コマンド実施後の計算結果(2.8722813232690143)が標準偏差の値になります。


リストの分散を求める

SciPyで標準偏差を求める際に分散は不要ですが、もちろん分散を求めることも出来ます。

  1. 「import scipy as sp」
  2. 「list = [1,2,3,4,5,6,7,8,9,10]」
  3. 「sp.var(list, ddof = 0)」

コマンド実施後に計算結果(8.25)が返ってきます。


リストの削除をおこなう

SciPyでリストの計算をおこなう際にリスト内の値を削除したい場合は、すでに使用しているリスト名に空のリストを記入することで削除が可能です。

「list = []」

削除ではなく数値の変更のみを行いたい場合は、直接新しい数値を入力し上書きすることで更新されます。

「list = [10,9,8,7,6,5,4,3,2,1]」


一次元リストの四則演算をおこなう

四則演算をおこなう際は、「+」・「ー」・「*」・「/」を用います。

一次元リストを作成した上で足し算・引き算・かけ算・割り算を実施しましょう。

「a = sp.array([0, 1, 2, 3, 4])」

「b = sp.array([2, 4, 6, 8, 10])」

足し算は「print(a + b)」でおこない、応答結果は「[ 2 5 8 11 14]」

引き算は「print(a ー b)」でおこない、応答結果は「[-2 -3 -4 -5 -6]」となります。

かけ算は「print(a * b)」でおこない、応答結果は「[ 0 4 12 24 40]」

割り算は「print(a / b)」でおこない、応答結果は「[0. 0.25 0.33333333 0.375 0.4]」となります。

割り算の場合は小数が入ると見づらくなりますが、編集が可能です。

その場合、スラッシュを2つ入力することで値が小数になり見やすくなります。

「print(a // b)」と入力すると、応答結果は「[0 0 0 0 0]」となります。


行列を作成する

データ処理をおこなう際に用いられる行列を作成する際もSciPyを利用することが可能です。

scipy.array()という引数を用意した上で、二次元のリストを作成します。

二次元のリストとはExcelの表の様に、縦(行)と横(列)が存在するリストのことです。

  1. 「import scipy as sp」
  2. 「sample = sp.array([[1,2,3],[1,2,3]])」
  3. 「print(sample)」

コマンドを実施すると以下のように応答が返ってくれば成功です。

「[[1 2 3]

[1 2 3]]」


行列の比較をする

データ分析を実際におこなう時は、1つの行列のみではなく複数の行列を比較することがあります。

Scipyでは、複数の行列の比較を容易におこなうことが可能です。

行列の各要素ごとの比較をおこなう場合は、「a == b」で要素ごとに比較が可能です。

  1. 「import scipy as sp」
  2. 「sample1 = sp.array([1, 2, 3, 4])」
  3. 「sample2 = sp.array([4, 2, 2, 4])」
  4. 「a == b」

比較結果は「array([False, True, False, True], dtype=bool)」と表示されますが、この時表示されている「True」とは一致・「False」は不一致を表します。

要素ごとの比較をおこないましたが、行列全体の比較をすることも可能です。

行列全体の比較は「sp.array_equal(○,○)」でおこないます。○部分には、比較したい行列が入ります。

  1. 「import scipy as sp」
  2. 「sample1 = sp.array([1, 2, 3, 4])」
  3. 「sample2 = sp.array([4, 2, 2, 4])」
  4. 「sp.array_equal(a,b)」

行列が一致している場合の表示は「True」・一致していない場合の表示は「False」です。


テキストファイルの出力

SciPyでは計算以外にも、テキストファイルの読み込みが可能です。

テキストファイルの読み込みをおこなう際は、以下のコマンドを実行します。

  1. 「import scipy as sp」
  2. 「with open(‘○○○.txt’) as file :」
  3. 「  print(file.read())」

○○○に任意のファイル名を入力し読み込みをおこうなうと、テキストファイルの内容が出力されます。


最適化問題とは

最適化問題とは「与えられた制約条件の下で、ある目的関数を大または最小にする解を求めること」です。

有名な問題としては、ナップザック問題・巡回セールスマン問題などがこれに当たります。

ナップザック問題:

容量 C のナップサックが一つとn 種類の品物(各々、価値 pi, 容積 ci)が与えられたとき、

ナップサックの容量 C を超えない範囲でいくつかの品物をナップサックに詰め、

ナップサックに入れた品物の価値の和を最大化するにはどの品物を選べばよいか

巡回セールスマン問題:

都市の集合と各2都市間の移動コスト(たとえば距離)が与えられたとき、

全ての都市をちょうど一度ずつ巡り出発地に戻る巡回路のうちで総移動コストが最小のものを求める

(セールスマンが所定の複数の都市を1回だけ巡回する場合の最短経路を求める)

長くなるためここで解法は記載しませんが、それぞれ整数・組み合わせを最適化するという問題です。

解法は何百パターンも発見されており、様々な方法を用いて解くことは可能ですが、普通に解いた場合は膨大な時間がかかるため、高速化のために日々研究がされています。

SciPyには、最適化問題を解くために必要な差分進化というアルゴリズムが実装されています。

SciPyをマスターすることでこのような問題をただ解けるようになるだけではなく、より短い処理時間で実施することが可能となり効率が格段に上昇することでしょう。


まとめ

SciPyを使いこなすことで、簡単な計算から高度な計算までを自由自在におこなうことが可能です。

慣れるまではサブパッケージの使い分けなど覚える事も多いですが、データ分析や機械学習、科学技術計算など様々な分野に応用できるためPythonを使っていくなら是非ともマスターしておきたいライブラリの一つです。

今回の記事は基本的な内容なので、今回の内容を基に様々な計算をおこなってみてください。


なお、Pythonには本記事でご紹介したSciPyやNumPyだけでなく、数多くのライブラリやフレームワークが存在しています。

これを機に、Pythonのさまざまなライブラリやフレームワークに触れてみてはいかがでしょうか。

関連記事:
Pythonフレームワークのおすすめ5選を徹底比較!特徴や人気度・エンジニアにとってのメリットは?学習方法もご紹介

Pythonライブラリのおすすめを解説!ダウンロード数トップ10の便利なライブラリの使い方と自作方法は?厳選レシピも紹介


toiroフリーランスは、SHIFTグループがプライムとして参画している独自案件をフリーランスエンジニア向けに紹介する唯一のプラットフォームサービスです。

エージェントによるサポートもありますので、ご利用を検討してみてはいかがでしょうか。