J. Plasma Fusion Res. Vol.94, No.2 (2018)８
６‐８９

講座

今日からはじめる Python
You're One of Pythonistas from Today

１．はじめに
1. Preface
吉沼幹朗
YOSHINUMA Mikirou
核融合科学研究所（原稿受付：２
０
１
７年１
１月２
０日）

汎用プログラミング言語のひとつである Python は，多くの環境で誰でも利用でき，簡単な記述で様々なことができるため利用者が増えています．プラズマ・核融合分野においても利用者を見かけるようになり，Pythonを使ってみようと考えている人も多いのではないでしょうか．本章では，Python がどのような言語であるかを手短に説明します．
Keywords:
Python, set-up, guideline

１．
１ Python とは押して，実際にはじめてもらうことをめざしています．Py-

プログラミング言語 Python は Guido van Rossum 氏にthon という言語を短く説明すると「誰でも利用できる書きよって作られました．Python と書いて，「パイソン」と呼やすく読みやすい汎用のプログラミング言語，だけど簡

ばれています．現在は Python ソフトウェア財団で管理，開単」となります．

発されています．数年前，すでに海外において多くのユー

１．
２ Python は誰でも利用できます

ザを獲得していた Python ですが，日本においては，和文の入門書や解説書の数も少なく，周囲で利用しているユーザ

Python は無料で利用できる の で，どなたでもインスも少 な い 状 態 で し た．近 年，大 量 に 取 得さ れ た デ ー タ

トールしておくことができます．また，Windows，Linux,（ビッグデータ）の統計解析やそれを用いた機械学習とOS X といった主要なプラットホームで利用できます．こいった技術が広まるとともに，日本においても，その解析

れは，共同研究をする上で非常に重要なことです．ある解手法の開発環境として Python のユーザが増加してきたと析プログラムを渡して実行をお願いしても，その実行環境思われます．最近では，書店のパソコン関連の棚にもタイのライセンスを相手が持っていない場合がしばしばあるた

トルに Python が入った書籍を見かけるようになり，入門

めです．Python で記述されたスクリプトは，主要なプラッ書も数多く出版されています．また，インターネット経由

トホーム上で誰でも実行できます．

でアクセスできる情報も充実しており，多くのサンプル

１．
３ Python は書きやすい言語です

コードや日本語による解説を見ることができます．
プラズマ・核融合分野においても，Python を利用してPython は，実行時の値によって変数の型が決められるいる人を見かけるようになりました．そろそろ使ってみよ（動的型付け）言語です．変数の型を指定する必要がないた

うと考えている人もいることでしょう．はじめようと思う

め，処理内容に集中して書くことができます．また，イン

けれど，これまで馴染んできた Fortran や C 言語といった

タラクティブな実行環境を持っているため，処理の記述

コンパイラとは異なる点に不安を覚えているかもしれませ（プログラム作成）と適用結果の表示を繰り返して解析をん．本講座は，はじめてみようかと思っている人の背中を進めていくことが容易です．

National Institute for Fusion Science, Toki, GIFU 509-5292, Japanauthor’s e-mail: yoshinuma@nifs.ac.jp

８６!2018 The Japan Society of Plasma
Science and Nuclear Fusion ResearchLecture Note

1. Preface

１．
４ Python は読みやすい言語です

M. Yoshinuma

行うインタプリタである Python は大雑把に言うならば C

Python では，ブロック構造をインデントを用いて表現言語と比べて数十倍遅いでしょう．しかし，実験データのするため，読みやすい構造をもった書式が維持されます．

解析処理のうちインタラクティブに進められるような時間

ブロック構造とは，条件つきの処理，繰り返し処理や関数スケールの処理については，記述しやすい Python を用い定義などの範囲のことです．自由形式の言語に慣れているる方が素早く結果を得られることがあるでしょう．Python

人にとっては，書きづらいと感じるかもしれません．また，から C 言語や Fortran のコードを利用することができます

インデントのずれによって正常に動かなくなることを不安

ので，時間がかかる処理を C 言語や Fortran に置き換えるに感じる人も多いと思います．しかし，読み易さを損なわことも可能です．Python は，それらの処理へのデータ入出ないためには，どの言語であっても一貫したインデントは力を担当することができるでしょう．そうすることで，C必要です．また，インデントのずれについては，TAB キー

言語や Fortran では記述するのが煩わしい入出力の部分

によって空白が入らないようにエディタを設定するだけでを，ユーザにとって便利なものにすることが容易になりま防ぐことができます．そして，Python では技巧的な短いす．

（パズル的で楽しい）記述よりも，わかりやすい記述が選ば

１．
８ Python を試してみよう

れます．このような特徴から，インターネット上の解説やスクリプト，さらには付属のライブラリまで，読んで理解

Python がどのような言語かイメージしていただけたでしょうか．Python は，以下のような場面で便利に利用できすることが比較的容易です．

るかと思います．
!電卓代りにちょっとした計算をしたい．

１．
５ Python は汎用プログラミング言語です!シェルスクリプトで解析処理を制御しているけど，よPython は汎用のプログラミング言語なので，データ解析のみならず，テキストファイルの処理，グラフィカル

り複雑な分岐制御をしたい．
!様々なデータファイルから必要なデータを取り出し

ユーザーインターフェース（GUI）の作成，ネットワークて，解析したい．

プログラミング，画像処理，ゲーム作成などパソコンで行
Python プ!解析処理プログラムを Fortran で書いたけど，入力

ログラムは，手続き的に記述することも，オブジェクト指データファイルの書式がバラバラだ．書式を合わせた

向や関数型と呼ばれるような技法で記述することも可能でい．

われるほとんどのことに利用できます．また!ネットワーク経由で情報を取得したい．サーバー上のあるため，そのようなプログラミング技法を理解することの助けにもなるでしょう．プログラミング入門用の言語と解析プログラムを自動で実行したい．
!解析結果をグラフで描画しながら解析を進めたい．

してもおすすめできます．

!すばやく解析処理を書いて，手法の可能性を確認した

１．
６ だけど簡単い．

Python が人気を得た理由のひとつとして，多くの有用第２章にて，Python を使えるようにする方法が説明さなモジュールの存在があると思われます．モジュールは，れますが，ここでは，環境を整える前に Python を試していパッケージと呼ばれる機能がつまったモジュールファイル

ただきたいと思います．ウェブブ ラ ウ ザ で https://try.

の集まりで，それらを自分の Python 環境にインストール

jupyter.org/にアクセスしてください．図１のようなペーすることによって，プログラムを開発しなくても必要な処

ジが表示されると思います．このページは，第２章で紹介

理が行えるようになります．Python に標準で備わっていされる Jupyter-notebook という対話型の Python 開発環境

るモジュールでも多くのことができますが，外部から提供を体験することのできるサービスです．右上のNewボタン

されるモジュールによって，さらに簡単にできるようになから Python 3 を選択すると，新しいノートブックファイル

ります．たいていの場合，行いたい処理に応じたモジューが作成され，図のような新しいノートブックページが開か

ルを利用することになります．プラズマ・核融合分野におれます．

い て は，数 値 計 算 や 解 析 の た め の 優 れ た モ ジ ュ ー ル

Jupyter-notebook では，セルと呼ばれるボックス内にス（NumPy，SciPy，Matplotlib，pandas）や，そ れ ら の モ

クリプトを入力します．まずは図２にあるように，ひとつジュールを便利に利用するための対話的な環境（jupyter）

目のセルに以下を入力してみましょう．

が利用されています．

print(’Hello world!’)１．
７ Python の欠点

このセルを実行するためには，再生ボタンを押すか，キー

よいことばかりのように書いてしまいましたが，Python

ボードの Shift + Enter を同時に押下してください．

は万能ではありません．C 言語や Fortran といったコンパ

実際に実行すると，入力したセルの下に「Hello world！」

イラ言語を使っている方は，その実行時の速度に不満を持が表示されると思います．C 言語などのコンパイル言語でつかもしれません．大規模な数値計算やシミュレーション

このような命令を実行するためには，まずは完全なソースの主となる部分に Python を利用することは考えるべきで

コードを作成し，コンパイルして実行ファイルを生成するはないでしょう．コードに依存しますが，動的な型付けを

こ と が 必 要 で す．一 方 で イ ン タ ー プ リ タ 言 語 で あ る
８７

Journal of Plasma and Fusion Research Vol.94, No.2 February 2018

図１

図２

http://try.jupyter.org のトップ画面．右上の New ボタンから新しいノートブックファイルを作成できます．

新しいノートブックファイルを作成したときの様子．ひとつ目のセルに print（’Hello world!’）と入力しています．

Python ではコンパイル作業が不要であるほか，開発途中

結果をすぐに可視化できます．このような特徴は，試行錯のソースコードでも途中まで実行できる点が特徴です．

誤しながら進める研究活動を行うのに有用なだけでなく，次に図３のように以下の内容を入力してみてください．

プログラムスキルを身に付けるためにも非常に効果的だと思います．もちろん，このような対話的な環境ではなく，

import numpy as np

一般的な言語と同じようにコマンドでの実行もできます．

import matplotlib.pyplot as plt

ぜひ第２章を読んで，開発環境をあなたの PC にインストールしてください．

x = np.linspace(-3, 3, 21)
x

１．
９ まとめ
Python をはじめてみようという気分になってきたで

y = np.exp(-x*x / 2)

しょうか．Python をはじめたばかりの方からは，どのようyなときにどのようなモジュールを利用したらよいか判断でplt.plot(x, y)

きない，モジュールの使い方がわからないという声を聞き

上記では，ベクトル変数 x と y を定義し，その内容を画面ます．そこで本講座では，プラズマ・核融合分野でよく利に表示したあと，グラフに描画しています．詳しくは，次用されている環境やモジュールを，みなさんが使い始める

号の NumPy や Matplotlib の説明によって明らかになるでことができるように紹介していきたいと思います．
本講座は，全３回の構成です．第１回の今回は「Python

しょう．

スタートアップガイド」として，Anaconda という Python

Python ではこのように，手早くコードを作成・実行し８８Lecture Note

1. Preface

M. Yoshinumaの実行環境のインストール方法を Windows，Linux，OS
X を利用の方に向けて説明します．その後，Python スクリ
プトの作成方法，実行方法と Jupyter-notebook という対話的な環境を紹介し，それを用いて Python の基本的な文法を説明します．次号では，「Python による科学技術計算」ということで，核融合分野に限らず，科学技術計算に利用されるモジュールである

NumPy ，SciPy，およびその結果をグラフとして描画するのに便利な Matplotlib の使い方が説明されます．また，機械学習を実行するモジュール
scikit-learn についても紹介されます．そして，３回目では，「Python の活用事例」として，LHD 実験や JT‐６０SA 実験に
おいてどのように Python が利用されているかを紹介していただきます．
なお，本記事で紹介するソースコードやデータは，http://purakaku-python.readthedocs.io にもアップロードしています．各自のパソコンでぜひ実行しながらお読みください．
図３

ノートブックファイルの実行例．

!!!!!!!!!!!!!!!!!

よし

ぬま

みき

ろう

吉 沼 幹 朗!!!!!!!!!!!!!!!!!

!!!!!!!!!!!!!!!!!!!!!!!!!!

核融合科学研究所，大型ヘリカル研究部，
助教．２
０００年，東北大学大学院工学研究科
電気・通信工学専攻博士課程修了．LHD
において中性粒子ビームを用いたプラズマ計測（荷電交換分光，モーショナルシュタルク効果分光）を行っています．特にプラズマ中の流れや電場構造の形成に関心をもって研究を行っています．LHD の実験シーケンスに同期させた解析プログラムの実行や解析データ可視化に
Python を利用しています．

!!!!!!!!!!!!!!!!!!!!!!!!!!

８９

J. Plasma Fusion Res. Vol.94, No.2 (2018)９
０‐１０１

講座 今日からはじめる Python

２．Python スタートアップガイド
2. Python Start-Up Guide
藤井恵介
FUJII Keisuke
京都大学工学研究科（原稿受付：２
０
１
７年１
１月２
０日）

Python は簡単に始めることのできる言語です．これまでプログラミングにほとんど触れたことのない人でも数クリックで環境構築を完了し，数分でグラフ描画までできることが特徴です．さらに，多様なパッケージが公開されており，最先端のデータ操作を無料で行うことも可能です．ここでは Python 開発環境の構築法を紹介します．さらに，少し発展的な話題として，外部パッケージを新しくインストールする方法，Python 開発環境を一
つの PC 内に複数構築する方法について述べることにします．
Keywords:
Python, Anaconda distribution, programming, open-source, virtual environment

２．
１ Python のインストールとパッケージマネー
ジングシステム

ケージはほとんどが３系に対応していることから，これからはバージョン３系を利用することをお勧めします．

２．
１．
１ Python 開発環境の構築

OS の bit 数などに合わせたバージョン（現在では６４bit

これまで，プログラミング開発環境の構築に手間取ってシステムが一般的です）をダウンロードしてください．ダ

何時間もかけた記憶のある人も多いと思います．しかし，ウンロードされたインストーラをクリックすることでイン

Python はそうではありません．本講座は「今日から始めるストールを開始できます．

Python」と題している通り，今日から Python プログラミ

詳細は後述しますが，Anaconda では Python 開発環境をングを始めることを趣旨としています．忙しい研究者のユーザ固有のもにするか PC 内で共通にするか選ぶことが方々の時間を，環境構築などにかけてはいられません．

できます．他のユーザと環境が衝突しないよう，個人ごと

セットアップは５分で終わらせましょう．

の環境を構築すること（図１の Just Me を選択）を勧めま

ここでは，Windows，Mac および Linux の各オペレー

す．インストーラが終了したあと，Anaconda Prompt や Ju-

ティングシステム（OS）上での Python 開発環境の構築法に

pyter Notebook というアプリケ ー シ ョ ン が ス タ ー ト メ

ついて述べます．開発環境をセットアップする方法も色々

ニューに登録されていれば Python 開発環境の構築は終了

ありますが，ここでは非常に簡単で人気のある Anaconda

です．

distribution という統合パッケージを利用することにします．

２．
１．
１．
２ Mac での開発環境構築

なお，Anaconda distribution の特徴や詳細については環

https://www.anaconda.com/download/にアクセスしま

境構築法を述べたあとに紹介します．Python を触ったこす．執筆時点の Anaconda distribution の version は５．
０．
１でとのない初心者は，環境構築が完了すれば以降は飛ばしす．ウェブサイトでリンゴの画像をクリックすると Py-て，次節の Jupyter-notebook を用いた Python 入門に進んthon 3.6 と Python 2.7 のインストーラーが出てきますのででもよいでしょう．

迷わず，3.6 version をダウンロードします．この際，Cheat

２．
１．
１．
１ Windows での開発環境構築

Sheet（Starter Guide）が必要かと聞かれます．必要な場合

まずは Anaconda distribution ダウンロードページ https:

は e-mail address を入力します．Get して損はないでしょう．

//www.anaconda.com/download にアクセスし，Windows

その後はインストーラを起動し，基本的に続けるボタン

版 Anaconda をダウンロードします．なお，（残念ながら）を押し，最後にインストールボタンを押せばインストール

Python にはバージョン２系（現在の最新は２．
７）と３系（現完了です．ここで在の最新は３．
６）という大きく２つのバージョン系列があwhich python

ります．Python2.7 のサポートが２０２０年に打ち切られることが議論されていること＊１，現在も開発続いているパッとすれば＊１ PEP373 https://www.python.org/dev/peps/pep-0373/
Kyoto University, KYOTO 606-8501, Japanauthor’s e-mail: fujii@me.kyoto-u.ac.jp

９０!2018 The Japan Society of Plasma
Science and Nuclear Fusion ResearchLecture Note

2. Python Start-Up Guide

K. Fujii

ルした方が良いようです．
brew install pyenv
pyenv install --list
でインストール可能な python の一覧が出てきますのでその中から anaconda3-..*を探し，pyenv install anaconda3-*.*.*
とします．
２．
１．
１．
３ Linux での開発環境構築
Anaconda distribution ダ ウ ン ロ ー ド ペ ー ジ https://www.anaconda.com/download に ア ク セ ス し，Linux 版
Anaconda をダウンロードしてください．
Anaconda3-5.0.1-Linux-x86̲64.sh というようなファイル名（５．
０．
１などの数字は Anaconda distribution のバージョン番号）のスクリプトファイルがダウンロードされます．
以下のようなコマンドを用いて，実行権限を付与して実行
してください．
chmod +x Anaconda3-5.0.1-Linux-x86_64.sh./Anaconda3-5.0.1-Linux-x86_64.sh
なお Linux 版 Anaconda でも，OS の Python 環境と切り離した環境を構築することが可能です．そのため上記コマン
ドは，管理者でなく一般ユーザの権限で実行することをおすすめします．ライセンスに同意すれば，インストールが始まります．
最後に Anaconda を Path に加えるか問われるます．ここ図１で yes を選択しておくとよいでしょう．これによりターミ

ダウンロードしたインストーラを実行している様子．

ナルから Python を実行する際に Anaconda の Python が優
先して選択されることになります．な お，デ ィ ス ト リ
ビューションによっては一度ログインし直す必要があるかもしれないので注意してください．
以上で Linux における Python 開発環境の構築は終了です．
２．
１．
２ Anaconda distribution
上 で 紹 介 し た Anaconda distribution は Anaconda Inc.
が開発する Python および R 開発環境を提供するオープン
ソース・ソフトウェアです．3-clause BSD License で提供されており，自由に利用することができます．
Anaconda distribution の主な特徴に

図２

インストール終了時のスクリーンショット．

/Users/[user_name]/anaconda/bin/pythonと な り，Default の python が MacOS の native の python（バージョン２．
７）から Anaconda の Python へと変更されて
図３いることがわかります．
なお，既に homebrew をインストールし て い る場合，
anaconda との衝突を避ける為に pyenv を先にインストー
９１

ターミナルからインストーラを実行している時の様子．ライセンス同意書に同意することでインストールが始まります．

Journal of Plasma and Fusion Research Vol.94, No.2 February 2018

図５
図４

xarray を conda コマンドにより実行している様子．

Anaconda を Path に加えるかを問われている画面．ここでyes を選択しておくとよいでしょう．

いています（依存関係があります）．conda コマンドでは，そういった依存関係のあるパッケージも自動的にダウン!優れたパッケージ管理システム

ロード・インストールされます．

!簡単な仮想環境の構築

インストールしたパッケージをバージョンアップするにはが挙げられるでしょう．これらの特徴のため，Anaconda

conda update xarray

distribution は Python の開発環境として非常に人気のある

アンインストールするにはものになっています．以下にその特徴を簡単に紹介します．
２．
１．
２．
１ 外部パッケージのインストール

conda uninstall xarray

Python では，言語の基本的な機能だけで実現できることは意外と少なく，実際にはほとんどの操作を外部のパッを実行すればよいでしょう．また，現在の環境にインス

ケージを用いて行うことになるでしょう．本講座でデータ

トールしているパッケージの一覧を確認するには，以下を解析を行う時も NumPy や Matplotlib など外部のパッケー

実行してください．

ジを用いることになります．

conda list

様々なプログラミング言語のなかでも Python は特に外部パッケージが豊富であり，そのインストールも非常に簡

その他のコマンドについては，Anaconda のマニュアル

単に行うことができます．現在１０万種類を超える多種多様

ペ ー ジ https://conda.io/docs/user-guide/tasks/manage-

なパッケージが公開されており，NumPy，Matplotlib を含

pkgs.html を参考にしてください．

めたこれらパッケージのほとんどはオープンで開発が行わ

２．
１．
２．
２ Anaconda によるパッケージ管理

れています．なお読者の方々も，プログラム開発に習熟す

Python では他言語との連携が容易であり，それを前提ればこれらの活動に参加・貢献することも可能です．ぜひとしたパッケージも多数存在します．例えば，Python の最コミュニティに貢献しましょう．

も基本的な数値計算パッケージである NumPy は，主に C

上述の通りに Anaconda distributionをインストールすれ

言語で書かれておりそれをパッケージ内部から呼び出してば，NumPy，Matplotlib を含めた基本的なパッケージは自います．さらに NumPy は，Intel が提供する並列計算ライ

動的にインストールされます．しかし，Python に慣れてく

ブラリ MKL と連携しており，行列計算などは自動的に並れば，より専門的なパッケージを用いることも多くなるこ

列化してくれます．他にも，データベースを操作する Post-とは間違いありません．そういった時には，新たにそれら

greSQL など実際には別の言語で書かれているパッケージのパッケージをインストールする必要があります．

も数多くあります．

ここでは例として，後の３章で紹介する多次元データ処Python 自体はクロスプラットフォームな言語なので，

理ツールである xarray を新たにインストールすることをOS 環境には依存しません．Windows で作成したスクリプ

考えます．なお少し詳細になりますが，Anaconda 環境でトをほとんど何も改変せずに Mac で動かすことも可能でパッケージをインストールする方法は大きく２つあります．

す．しかし C 言語や Fortran などで OS のコンパイラを用いる場合や，並列化計算を実現するためにはその実装は!Python の持つパッケージインストールコマンド pip

OS に依存したものとなってしまいます．Anaconda は各プを用いる方法ラットフォームに合わせたバイナリ・コンパイラを提供し!Anaconda の持つパッケージインストールコマンドており，conda コマンド一つで，それらパッケージのダウ

conda を用いる方法

ンロード・コンパイル等，必要なことを自動的に行ってく

以下で少し触れるように conda の方が高機能であるため，れる仕組みになっています．そのためユーザーは，OS の違

こちらを用いるほうがよいでしょう．conda コマンドで新いを気にすることなく，パッケージをインストールした

たなパッケージをインストールするためには，以下を実行

り，実行したりできるのです．

してください．

２．
１．
２．
３ Anaconda による Python 仮想環境
Anaconda によって構築 し た Python 開 発 環 境 は，OSconda install xarray

内の環境とは独立した仮想環境になっています．例えば

これによりPython環境にxarrayがインストールされます．

Anaconda 内でパッケージをインストールしても，OS の環

なお，xarray は別のパッケージである Pandas を内部で用境，他のユーザの環境に影響を与えません．そのため，管
９２

Lecture Note

2. Python Start-Up Guide

理者権限を持たないコンピュータ上にもホスト PC の環境

K. Fujii

なっていることを示す表示です．

を崩さずに開発環境をインストールすることができます．

なお，上記コマンドで作成した仮想環境には，NumPy

さらに，ユーザ各自が好きなパッケージをインストールすなどのパッケージはインストールされていません．以下にることができるため，個人のPCだけでなく，共同で用いる述べた方法によりパッケージをインストール・アンインス

計算サーバでの利用にも適していると言えるでしょう．

トールすることが必要です．

もっと言うと，このような仮想環境を１つの PC 内に複

なお，この仮想環境を非アクティブ化するにはWindows

数構築することも可能です．例えば研究を進めていくと，

では以下をあるパッケージの過去のバージョンでしか実行できないの

deactivate py27

古いプログラムを使いたいといった場合も出てくるでしょう．通常であれば，PC 内のそのパッケージのバージョンをMac，Linux では以下を実行してください．

全て古いものに戻す必要がありますが，そうしてしまうと

source deactivate py27

これまで開発してきたスクリプトが動かなくなるなどトラブルが想定されます．
こういった場合には，これらのプログラムを動かす環境

２．
２ 対話的開発環境を用いた Python 入門

を普段使っている環境と隔離した仮想環境として構築する

２．
２．
１ 対話的開発環境 Jupyter-notebook

ことが有効でしょう．ある仮想環境でインストールした

本節では，対話的プロ グ ラ ミ ン グ 環 境 の１つ で あ る

パッケージは他の環境に影響を与えないため，その古い

Jupyter-notebook を紹介します．Jupyter-notebook はパッケージ専用の仮想環境を用意すれば，安全に利用する!実行結果を可視化しながらデータ解析を進めることがことが可能です．

できる

Anaconda で は，以 下 の コ マ ン ド を 実 行 す る こ と で!ソースコード，実行結果，グラフ，数式，文書を１つ

Python の仮想環境を構築することができます．

のファイルに保存することができる

conda create -n py27 python=2.7などが特徴で，近年利用が大きく広まっています．

このコマンドは，Python 2.7 が動く py27 という名前の仮

元々 Jupyter-notebook は IPython という Python の対話

想環境を作る，という意味です．このようにして作成した的プログラム環境の一部の IPython-notebook として開発

仮想環境 py27 をアクティブにするには，Windows では以が進められてきましたが，その有用性が認められ，現在は下をPython に限らず Julia，R，ruby など他のインタープリタ言
語でも利用可能な汎用ソフトウェアとして開発が続けられ

activate py27ています．

Mac，Linux では以下を実行してください．

上記の特徴は，試行錯誤しながらすすめる研究活動を行うのに効果的なだけでなく，研究成果をデータ・解析コー

source activate py27

ド・結 果 を ま と め て 公 開 す る の に も 有 用 で す．例 え

コマンドプロンプト・ターミナルに(py27)と表示されば，２０１６年に重力波が初めて発見された時の計測データ・ていると思います．これは py27 仮想環境がアクティブに

解 析 プ ロ グ ラ ム は https://losc.ligo.org/s/events/GW
150914/GW150914̲tutorial.html に Jupyter-notebook 形 式で公開されており，誰でもその結果を追試することができるようになっています．
２．
２．
１．
１ Jupyter-notebook のインストール
本講座で紹介した Python 環境の１つである Anacondaには，すでに Jupyter-notebook が含まれています．インス
トールされていない別の環境などではターミナルから
conda install jupyter-notebook
もしくは
pip install jupyter-notebookを実行することでインストールできます．

図６

２．
２．
１．
２ Jupyter-notebook の起動と終了

Windows で仮想環境 py27 をアクティブにする様子．

Windows での起動
Windows から Jupyter-notebook を起動するための手順
は，以下の通りです．

図７

Linux で仮想環境 py27 をアクティブにする様子．

９３

Journal of Plasma and Fusion Research Vol.94, No.2 February 2018

２．
２．
２．
１ Python の基本変数

１．コマンドプロンプトを立ち上げる（必要に応じてC 言語や Fortran のようなコンパイラ言語と異なり，変ディレクトリに移動する）

数（オブジェクト）を定義する際にその型を指定する必要

２．起動コマンド jupyter-notebook を入力するがありません．

これにより，自動的にブラウザが立ち上がり，Jupyter-In [1]: x = ’Hello python!’notebook のホーム画面が表示されます．
Mac，Linux での起動

In [2]: y = 2

Mac，Linux の場合も同様に
１．ターミナルを立ち上げる（必要に応じて適宜ディレ

In [3]: x

クトリを移動する）

Out[3]: ’Hello python!’

２．起動コマンド jupyter-notebook を入力する
In [4]: y

上記操作を行うことで，１章の図１と同様の画面がブラOut[4]: 2

ウザに表示されます．なお，ブラウザを誤って閉じてしまった場合も，http://localhost:8888 にアクセスすること

上記の場合 x は文字列（str）であり，y は整数（int）となりで，Jupyer-notebook のホーム画面を再度表示できます．

ます．オブジェクトの型を知りたい場合は，In [5]: type(x)ノートブックファイルの新規作成

Out[5]: str

Jupyter-notebook のホーム画面では，ディレクトリがツ
リー表示されています．フォルダ間の移動，ファイル・In [6]: type(y)フォルダの名前の新規作成・名前の変更・削除など，シンOut[6]: int

プルなファイル操作は Jupyter-notebook内で一通りできるようになっています．ディレクトリを適宜移動し，ノートを実行してください．なお，type()関数は，引数のオブブックファイルを新たに作成して学習を始めましょう．

ジェクト型を返す関数です．
Python の基本的な型には主に以下のものがあります．

前節で体験したように，右上の New から Python 3 を選択すると，新しいノートブックファイルが作成され新しい!整数（int）

ウィンドウとして開かれます．作成されるファイル名はデ!浮動小数点実数（float）

フォルトでは Untitled となっており，ページの最上部に表!文字列（str）

示されています．この部分をクリックするとファイル名を!リスト（list）

変更するダイアログが表示されますので，適宜わかりやす!タプル（tuple）

い名前に変更してください．

!辞書（dict，別名：連想配列）

Jupyter-notebook の終了
Jupyter-notebook には，個別のノートブックファイル

Python はオブジェクト指向の言語であり，実際には後（カーネル）の終了と Jupyter-notebook 自体の終了の２ほど説明する NumPy などのパッケージに含まれる上記とつのレベルの終了があります．カーネルとは Python を実は別の型（オブジェクト）を多用することになりますが，行しているコアの部分のことであり，オブジェクトの内容

ここではまず，上記の基本型を学びましょう．

をメモリ格納していたり，何か計算をしていたりします．

整数・浮動小数点

ブラウザ画面を閉じるだけではカーネルは終了されませPython は他のプログラム言語と同様，整数や浮動小数

ん．つまり，データはメモリ内に残されたままになってい点といった型をサポートしており，四則演算やべき乗等はます．ツールバーの一般的な書き方で計算できます．

File > Close and halt を実行することで カ ー ネ ル を 終 了 し て く だ さ い．も し く は，Jupyter-In [7]: 1 + 3

notebook ホーム画面の Running タブには，カーネルが実行

Out[7]: 4

中であるノートブックファイル一覧が表示されています．
そこで該当するノートブックファイルの shutdown ボタン

In [8]: 3.0 ** 2.0 # ** はべき乗を表します．

を押すことでも，カーネルを停止することができます．

Out[8]: 9.0

Jupyter-notebook 自体を終了するには，起動したコマン
ドプロンプトもしくはターミナルにて Ctrl+Cを入力しIn [9]: (1.0 + 3.0j) * 2.j # 複素数は，数字の末尾に jてください．

を付けることで表すことができます．

２．
２．
２ Python 入門

Out[9]: (-6+2j)

ここではJupyter-notebookを使って，Pythonの文法を学
文字列

びます．

str は文字列を格納するオブジェクトです．文字をシン
９４

Lecture Note

2. Python Start-Up Guide

K. Fujii

グルコーテーションもしくはダブルコーテーションで囲うすることで，リストオブジェクトを作成することができまことで文字列となります．なお，３連のシングルコーテー

す．なお，それぞれのオブジェクトは型が異なっても問題

ションで囲うと，改行を含めた文字列として扱うことがでありません．

きます．

In [19]: z_list = [x, 3.0, x2]

str オブジェクトの各要素にアクセスするためには，[ ]演算子を利用してください．このように，連続的なオブIn [20]: z_list

ジェクトに添字を用いてアクセスする方法を Indexing（イOut[20]: [’Hello python!’, 3.0, ’Hello python!

ンデクシング）と呼びます．

I love you !’]In [10]: x = ’Hello python!’

リストも，文字列の場合と同様に，インデクシングやスライシングに対応しています．

In [11]: x[0]Out[11]: ’H’

In [21]: z_list[-1]Out[21]: ’Hello python! I love you !’In [12]: x[2].appendを用いることで，リストの末尾に新しいオブジェOut[12]: ’l’

クトを追加することができます．

In [13]: x[-1]In [22]: z_list.append(5.0)

Out[13]: ’!’In [23]: z_list

Python のインデクシングには，以下の特徴があります．

Out[23]: [’Hello python!’, 3.0, ’Hello python!

!一番最初の要素は０番目として数えられる（C 言語と

I love you !’, 5.0]

同様．Fortran と異なる）

また，要素数は len 関数により知ることができます．

!負のインデクスを指定することで，末尾から数えることもできる．例えば，インデクスとして‐1 を指定する

In [24]: len(z_list)と，末尾の要素，‐2 を指定するとOut[24]: 4

末尾から２つ目の要素にアクセスでます．

タプル

さらに，同時に複数の要素にアクセスするスライシング

タプル（tuple）はリストと似ていますが，要素数が後（Slicing）も可能です．

から変更できないという点でリストと異なります．()内に複数の要素を記述するか，あるいは単純にコンマ区切り

In [14]: x[1:4]で記述することで，タプルオブジェクトを作成することがOut[14]: ’ell’

できます．

In [15]: x[:5]In [25]: t = (1, 3.0, x)Out[15]: ’Hello’
In [26]: t
In [16]: x[-3:]Out[26]: (1, 3.0, ’Hello python!’)Out[16]: ’on!’
In [27]: a, b = 2.0, 3.０ # (a, b)に(2.0, 3.0)を代

1:4 という表記は，（０から数えて）１〜３番目の要素

入していますを示し，元のオブジェクトの部分要素が選択されることにIn [28]: a, b

なります．また，片方を省略した:5 などは，0:5 と同じ意

Out[28]: (2.0, 3.0)

味です．

辞書

ここで x は文字列（str）ですが，文字列は以下のように辞書は連想配列とも呼ばれ，リストと同様に複数の要素+記号で結合できます．

を格納できるオブジェクトです．ただし，引数（キーと呼In [17]: x2 = x + ’I love you !’ぶ）に任意の（より厳密には，ハッシュ可能な）オブジェ
クトを用いることができる点でリストと異なります．なおIn [18]: x2

一般的には以下のように，文字列をキーにする場合が多い

Out[18]: ’Hello python! I love you !’

でしょう．

リスト

In [29]: d = {’a’: 1.0, ’b’: 3.0}

リスト（list）は複数のオブジェクトを格納するオブジェクトです．[ ]内に複数の要素をコンマ区切りで記述
９５

Journal of Plasma and Fusion Research Vol.94, No.2 February 2018

少し異なります．C 言語や Fortran では整数を１ずつ増やIn [30]: d[’a’]

しながら実行することが多いですが，Python ではリスト

Out[30]: 1.0
In [31]: d[’c’] = 5.0（やタプル）を１つずつ選択しながら，全ての要素に対して操作を繰り返すことになります．

# 新しい要素を追加するには，単に新しいキーを指定して値を代入してください．

In [33]: for z in z_list:....:____print(z)In [32]: d....:Out[32]: {’a’: 1.0, ’b’: 3.0, ’c’: 5.0}

Hello python!
3.0

上記のように，{ }内に，キーと要素を:で対応させて記述

Hello python! I love you !

することで辞書型のオブジェクトを作成できます．

5.0

２．
２．
２．
２ Python の基本文法
この節では，Python の主な文法を簡単に紹介します．C

上記は，z_list の各要素を１つずつ z に代入してイン言語や Fortran などでは例えば if 文の及ぶ範囲を{ }や IF-

デントで表されたコードブロックを実行する，という操作

END IF で囲って表記します．一方で Python ではそれらをを z_list の最初の要素から最後の要素まで繰り返していインデントで表します．なおインデントには４つのスペー

ます．

スを用いることが一般的です．

C 言語や Fortran の for ループと同様の操作は，０から指if 文

定した値までの整数を順に並べたオブジェクトを返す

Python の if 文は以下のように，if [条件] :と書き，条range 関数を用いることで実現できます．

件が真の場合に実行する内容を次の行から新たなインデン

In [34]: for i in range(len(z_list)):トを用いて記述することになります．
if a < b:____print(a)

....

:

....

:

print(z_list[i])Hello python!
3.0

while ループ

Hello python! I love you !

while ループも同様に，繰り返し実行する内容をインデ5.0

ントにより区別して記述します．

内包表記

while a < b:

ソースコードは一般的に，短いほど可読性が上がりま____a += 1

す．Python には内包表記と呼ばれる記述方法がありま____print(a)す．これは，ループ構造を簡略的に記述するもので，簡単

for ループ

な操作を行う時によく用いられます．

Python の for ループは，C 言語や Fortran の do ループと

図８

Jupyter-notebook のサジェスト機能の様子．np.まで入力してから，Tab を押すことで np パッケージ内でアクセスできるものが表示できます．

９６

Lecture Note

2. Python Start-Up Guide

In [35]: x_list = [1.0, 2.0, 4.0]

K. Fujii

Out[3]: 1.0
NumPy では非常に多くの種類の関数やクラスが用意さ

In [36]: y_list = [x**2 for x in x_list]

れています．そのためどのような関数が用意されているかを把握することも難しく，それらの使用法をすべて暗記す

In [37]: y_list

ることはほとんど不可能でしょう．

Out[37]: [1.0, 4.0, 16.0]

NumPy などのオープンソースソフトウェアでは，開発

上記の例の２行目は，x_list から１つ要素を取ってきに際して，使用法などの文書を同時に残していく文化が形て x に代入し，それぞれの二乗の値を要素にもつリストを成されており，ユーザがある関数の使い方を知りたいと

y_list に代入する，という意味であり，以下を一行で記思った場合もすぐにその情報にアクセスできるようになっ述したものに相当します．

ています．
Jupyter-notebook では，以下のように np.まで記入してIn [38]: y_list = []から Tab を押下すると，np.内にある関数一覧が表示されるほか，np.s まで記入してから Tab を押下するとそれにIn [39]: for x in x_list:
....

:

....

:

合う候補を表示してくれます．また，使用法がわからない

y_list.append(x**2)関数でも，カーソルが括弧内にあるときに Shift + Tab を押下することで，それぞれの関数の使い方に関する文書

２．
２．
３ 外部パッケージの使用（docstrings と言う）を表示させることができます．これらを読むことで，新しい関数でもその使い方をすぐに理解す

前節でも述べたように，多様なパッケージ（いくつかのることができるでしょう．

機能をまとめたライブラリ）が豊富に開発されていること

さらに，科学技術用途以外も含め Python は広く用いらが Python の大きな特徴の１つです．
実際には生の Python だけで用いることは少なく，基本れている汎用言語なので，インターネットで検索するだけ的な数値計算機能を提供する NumPy＊２やグラフ描画ライ

でも多くの情報を見つけることができるのも特徴です．

＊３

多次元配列型 np.ndarray

ブラリである Matplotlib を始めとして外部パッケージを

NumPy は，多次元配列用のクラス（クラスについては後多用することになると思います．
２．
２．
３．
１ NumPy を利用するで少し紹介します）である np.ndarray を提供していま

NumPy や Matplotlib はデータ解析における最も基本的す．（なお，"nd" array は，n-dimensional の略です）．np.

なパッケージです．前節の方法に従って Anaconda をイン

ndarrayは配列の大きさを後から変更できない，全ての要ストールした環境では，これらは既にインストールされて素の型が同一なものに限られる，という点はリストと異ないるので，すぐに使い始めることができます．

りますが，同様にインデクシング・スライシングに対応しこういったパッケージをています．

各自で開発するスクリプトでnp.ndarray は，多次元配列の基礎となるクラスで，線用いるためには，以下のような import 文によりその使用を形演算を含む多くの NumPy 関数で利用される他，pandas

宣言する必要があります．

など他のライブラリでも広く利用されている基本的なオブIn [1]: import numpy as np

ジェクト形式となっています．詳しくは３章で紹介しますが，ここではその利用法について簡単にだけ触れることに

ここで import numpy as np は，「NumPy パッケージをします．

np という名前で用いる」という宣言です．なお，as の後ろの名前はユーザが勝手に決めてよいものですが，混乱を避

np.ndarray を定義するためには，np.ndarray から用けるため，広く用いられている略称を用いることが望まし意するか，np.ones や np.linspace などの関数を用いる

いでしょう．NumPy の場合，np が正式な略称です．このことになります．

ようにしてインポートした後は，その機能を np.***とい# [5 x 3 x 2]の大きさの配列を x として確保する．

う形で用いることになります．

In [4]: x = np.ndarray((5, 3, 2))

NumPy の代表的な関数
NumPy を用いることで，多くの種類の算術演算を行うこ# [2 x 3] の大きさで，要素がすべて 1 の int 型の配列を y としとができます．例えば sin 関数は以下のようにして用います．

て確保する．

In [2]: x = np.sin(0.5 * np.pi)

In [5]: y = np.ones((2, 3), dtype=int)

In [3]: x

In [6]: y＊２ NumPy, NumPy developers, http://www.NumPy.org/＊３ Matplotlib, John Hunter, Darren Dale, Eric Firing, Michael Droettboom and the Matplotlib development team, https://matplotlib.org/

９７

Journal of Plasma and Fusion Research Vol.94, No.2 February 2018

図９

Jupyter-notebook による docstring 表示の様子．関数内部（括弧‘‘()‘‘の内側）で Shift + Tab を入力することで，関数名，引数，docstring を表示できます．

な描画方法についてのみ述べます．

Out[6]:

Jupyter-notebook 内で Matplotlib を表示するには，以下array([[1, 1, 1],を宣言します．

[1, 1, 1]])

import matplotlib.pyplot as plt

np.ndarray とスカラー，np.ndarray 同士の計算は，%matplotlib inline

要素ごとの計算として定義されています．
（broadcast）と呼ばれています．

import matplotlib.pyplot as plt は，matplotlib
パッケージの中の pyplot モジュールを plt という名前で用In [7]: y * 3いるという意味です（パッケージ，モジュールなどの厳密Out[7]:

な定義は，後の「Python の階層構造」を参考にしてくださ

array([[3, 3, 3],い）．また matplotlib inline は Jupyter-notebook 用の[3, 3, 3]])

コマンドであり，コードセルのすぐ下に Matplotlib の図を表示させるためのものです．

In [8]: y + y以下のように，plt.plot の引数に１次元データを渡す

Out[8]:

ことで，横軸が要素番号，縦軸が要素の値のグラフを描画

array([[2, 2, 2],

できます．

[2, 2, 2]])

In [10]: x = np.linspace(0,1,11) # 0 〜 1 を１１等分しまた，np.abs()や np.square()などスカラーを引数た要素を持つ np.ndarray を返す関数に持つ関数に渡した場合は，要素ごとに該当する演算が行われた np.ndarray が返されます．

In [11]: y = np.sin(np.pi * x)

In [9]: np.sin(y)In [12]: plt.plot(y)Out[9]:

Out[12]: [<matplotlib.lines.Line2D at 0x7f

array([[0.84147098, 0.84147098, 0.84147098],}

6201e95128>][0.84147098, 0.84147098, 0.84147098]])
２．
２．
３．
２ Matplotlib を利用する
Matplotlib は，広く用いられているグラフ描画ライブラ
リです．Matlab のグラフ描画機能を参考にして開発された
ようで，よく似た命名規則を持っています．Matplotlib の詳しい使い方自体も次章に譲ることにして，ここでは単純
９８Lecture Note

2. Python Start-Up Guide

K. Fujii

使うだけのプログラムでも，簡単に記述しておくことが重要でしょう．
関数の内部（インデントで示される領域）では必要な計算を行い，必要であれば return 文で値を返します．なお，
Python の関数は複数の値を返すことも可能です．その場合，戻り値はそれらを含むタプルとなります．
定義した関数は以下のように，引数にオブジェクトを渡すことで実行します．
In [2]: r = np.linspace(0, 1, 21)# 0 〜 1 を 21 等分した点列
In [3]: theta = np.linspace(0, 4.0 * np.pi, 21)# 0 〜 4(!) を 21 等分した点列２．
２．
４ 関数を定義して使う

In [4]: x, y = get_xy(r, theta)

これまで，np.sin を始めとする関数を用いてきました．
このように，何か操作をして値を返すもの（ファイルを保In [5]: plt.plot(x, y)

存するなど値を返さないものもある）を関数と呼びます．

Out[5]: [<matplotlib.lines.Line2D at 0x7f6201

本節ではこのような関数を定義して用いる方法について述

e370b8>]べます．
なお，もし NumPy などの外部パッケージが同様の操作を行う関数を定義している場合はそちらを用いる方がよい
ことがほとんどです．既存のパッケージは，大勢で作成・動作確認しているため，個人が作成したものよりもバグが圧倒的に少なくなっています．さらに NumPy のように，Cや Fortran を裏で利用して高速化を行っていることも多いでしょう．
以下に例として，極座標変数（r, theta）から直行座標での値（x, y）への変換を行う関数を定義してみます．
In [1]: def get_xy(r, theta):
...:

”””

...:

Returns x, y values from polar coordinate variabler (radial coordinate) and theta (angular coordinate).

...:

”””

...:

x = r * np.cos(theta)...:y = r * np.sin(theta)...:

return x, y２．
２．
５ スクリプトファイルを読み込む
上記の関数など，作成したスクリプトを再利用するためには，スクリプトファイルとして作成しておくほうが良い
でしょう．

...:

スクリプトファイルと言っても，これまで学習した内容

上記のように，関数の定義は def 文から始め，関数名を.py ファイルに保存するだけです．なお，import 文や変（get_xy）の次にカッコ内に引数（r，theta）を指定し，数の定義はファイルをまたいでは引き継がれないため，ス

コロンの後に改行します．関数の範囲はインデントによりクリプトファイルごとにそれらを適宜記入する必要がある

示すことが必要です．なお，慣習として関数名は小文字ででしょう．
前節で定義した関数をスクリプトファイルとして保存す始めることになっています．
また動作上必須ではありませんが，def 文の次の行にはるには，以下のような内容をファイルとして保存してくだ

その関数の説明，操作の内容や引数・戻り値の意味などを

さい．今回は，これを polar.py として保存したとしましょ

３つのダブルコーテーションで囲った文字列として書いてう．

おくことが推奨されています（この説明文は docstrings

import numpy as npと呼ばれます）．docstrings を記述しておくことで，メンテナンス時に関数の役割を思い出しやすいほか，Jupyter-def get_xy(r, theta):

notebook などの開発環境ではその使用法をソースコード”””を読むことなく理解できるという利点があります．自身で
９９

Journal of Plasma and Fusion Research Vol.94, No.2 February 2018

２．
２．
６．
２ クラスの使い方 np.ndarray

Returns x, y values from polar coordinate variable r

クラスはオブジェクト指向の重要な概念です．その定義(radial coordinate) and theta (angular coordinate).

を説明する前に，ここではまずその一例である np.ndar-”””

ray を紹介します．

x = r * np.cos(theta)

In [1]: x = np.linspace(0,1.1,12)y = r * np.sin(theta)
return x, yIn [2]: x

このスクリプトファイルを読み込むためには，以下のよう

Out[2]:に import 文を用いてください．

array([0., 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7,
0.8, 0.9, 1., 1.1])

import polar

ここで，x は１２個の要素からなる１次元ベクトルです．

r = np.linspace(0, 1, 31)

言葉の定義を少し明確にしておきましょう．
「クラス」

theta = np.linspace(0, 4.0 * np.pi, 31)

は型名のことであり，ここで x のクラスは np.ndarrayx, y = polar.get_xy(r, theta)

です．一方，x は np.ndarray 型を持つ変数です．オブ

なお，import 文で読み込めるスクリプトファイルは，実ジェクト指向の言語ではこの変数のことを「オブジェク

行するスクリプトと同じディレクトリ内かパスの通ったト」や「インスタンス」と呼びます．
各オブジェクトは，内部に変数や関数などの別のオブディレクトリのみとなります．任意の場所にあるスクリプ

ジェクトを有していることが多々あります．例えば np.

トファイルを読み込むためには

ndarrayのオブジェクトは，アレイの大きさや次元数など

import sys

を別のオブジェクトとして有しています．

sys.path.append(’path/to/script’)

In [3]: x.shape # x の形状

import polar

Out[3]: (12,)というように，Python のカーネルからパスを通す必要があることに注意してください．

In [4]: x.ndim # x の次元数

２．
２．
６ Python スクリプトの階層構造

Out[4]: 1

Python はオブジェクト指向の言語であり，いくつかの階層構造があります．例えば，NumPy などのライブラリ

このように，オブジェクト内部のオブジェクトには「オブは，「パッケージ」と呼ばれる大きなコード群として提供

ジェクト名．オブジェクト名」というように「．」を使うこされています．また各パッケージには，「モジュール」ととでアクセスできます．

呼ばれる小さなコード群が複数含まれることが多くなってクラスは，それ自身の値を操作する関数（メソッドと呼います．例えば，NumPy の線形代数機能は linalg というぶ）を有していることも多いでしょう．例えば np.ndar-

名前のモジュールで提供されています．

ray の場合，reshape メソッドを実行することで１２要素を持つ１次元の np.ndarray を３x４要素を持つ２次元行列

さらに，各モジュールには「クラス」が定義されていることがあり，その中に変数や関数（クラスに付属する関数に並び替えることができます．このようなメソッドにもはメソッドと呼ばれる）が含まれています．

「．」を用いてアクセスできます．

クラスは，オブジェクト指向プログラミングに必要な重In [5]: y = x.reshape(4,3)

要な概念ですが，発展的な内容を含むため，ここでは詳し

In [6]: y.shape

くは紹介しません．ただし多くのライブラリで用いられる

Out[6]: (4, 3)

ことが多いため，その使用法だけを簡単に紹介します．
２．
２．
６．
１ パッケージ内・モジュール内へのアクセス

In [7]: y

これまで NumPy の sin 関数を実行する際，np.sin()Out[7]:

を実行しました．これは，NumPy パッケージ内に定義されarray([[ 0. , 0.1, 0.2],ている sin 関数を呼び出すための記法です．ここで「．」[ 0.3, 0.4, 0.5],は，１つ下の階層への移動を意味するもので，この例の場[ 0.6, 0.7, 0.8],

合「パッケージ名．関数名」という形式でアクセスしている[ 0.9, 1. , 1.1]])

ことになります．
同様に，NumPy パッケージ内の fft モジュール内の実数

この reshape のように，一般的にメソッドは，自分自身に対する高速フーリエ変換 rfft を実行するためには np.

（ここではオブジェクト x）と，それに加えて引数（ここでfft.rfft というように「パッケージ名．モジュール名．関は 4, 3）を受け取り，何か戻り値（ここでは別の np.ndar-

数名」と言う形式でアクセスする必要があります．

ray 型のオブジェクト y）を返す関数になっています．
本講座では，クラスをどのようにして定義するかなどは
１００

Lecture Note

2. Python Start-Up Guide

K. Fujii

省略しますが，クラスはデータ（上の例では x に格納されており，一般的なデータ解析では，それらで定義されたオている値）と機能（reshape などのメソッド）をひとまとブジェクトを使用するだけで十分なことが多いでしょう．

めにしたものであると理解できれば，外部パッケージの使

データ解析では試行と可視化の繰り返しが重要です．特用には十分でしょう．

に，新しい実験データ・シミュレーションデータが得られ

２．
２．
７ まとめ

た時のように確立した解析法がないデータから意味を抽出

本節では，Jupyter-notebookを用いることでPythonの基する必要がある場合には，精緻なプログラムを構築すると本的な文法と使用法を概観しました．Jupyter-notebook

いうよりは，外部パッケージを使っていろいろな解析をのような対話的な環境では書き間違いなどによるバグがす

様々に試してその結果を可視化する，というサイクルを高ぐに見つかるため，特にプログラミングに不慣れな人に速に回す方が効果的であることが多いと思います．

とって効果的な学習環境となるでしょう．

これから Python を学ぶ読者も，その厳密な文法を学ぶ

本節では，Python の基本的な文法を紹介したのみで，例

前に，以降の章で説明する外部パッケージを用いてまずはえばクラスの定義法やオブジェクト指向プログラミングな

実際のデータを解析してみて，その結果を見ながら徐々に

ど は 詳 し く 述 べ ま せ ん で し た．し か し Python に は，

言語に慣れていくという方針をとるとよいように思いま

Numpy や Matplotlib などの多様なパッケージが用意されす．

!!!!!!!!!!!!!!!!!

ふじ

い

けい

すけ

藤 井 恵 介京都大学工学研究科専門は光計測，機械学
習．２
０１
２年３月京都大学工学研究科博士後期課程修了．豊富に蓄積されているプラズ
マ実験データの有効利用を目指して，統計的手法・機械学習の導入に奮闘しています．
趣味ではオープンソースソフトウェアの開発にも参加しています？ https://github.com/fujiisoup.プラズマ・核融合分野でもオープンソース・ソフトウェアの文化が広まればいいですね．

!!!!!!!!!!!!!!!!!

!!!!!!!!!!!!!!!!!!!!!!!!!!

!!!!!!!!!!!!!!!!!!!!!!!!!!

１０１

J. Plasma Fusion Res. Vol.94, No.3 (2018)１
４１‐１４９講座 今日からはじめる Python

３．Python による科学技術計算
3. Scientific Computing in Python

３．
１ NumPy/SciPy によるデータ解析
3.1 NumPy/SciPy for Data Analysis
釼持尚輝
KENMOCHI Naoki
東京大学大学院 新領域創成科学研究科（原稿受付：２
０
１
８年１月２
３日）

NumPy は Fortranのような多次元配列と科学技術計算をサポートするライブラリです．これにより配列全体への演算が可能となります．本章では，実際にプラズマ実験のデータ解析を行いながら，配列の読み書き，作成，
配列演算について解説します．さらに，高度な科学技術計算に関する様々な機能を提供するパッケージである
SciPy についても，使い方を紹介します．例として，簡単なシミュレーションもできる SciPy パッケージの odeint
モジュールを用いた微分方程式の数値解法例を示します．
Keywords:
python, numpy, scipy, simulation

３．
１．
１ はじめにずに実現できる

本章までに，Python で簡単な解析やプログラムの構築

・CPU のベクトル化演算の恩恵を受けられる
SciPy

はできるようになりました．次にみなさんが行いたいのは，実験データの解析やシミュレーションでしょう．そこ

SciPy は NumPy を利用するパッケージであり，高速フーで，Python における科学技術計算の基礎ライブラリであリエ変換，最適化，数値積分，信号処理などの科学技術計

る NumPy の使い方を，実際の実験データを解析しながら算に関する機能を提供しています．SciPy では，Fortran

紹介します．更に，高度な数学的アルゴリズムを提供するのプログラムで実装された多くの関数群を提供しており，

SciPy に関する簡単な紹介とともに，シミュレーションのPython のスクリプト言語としての機能を大幅に強化して例としてPredator-Preyモデルの簡単な解析例を示します．

います．このおかげで，Python が科学技術計算において本 章 で 興 味 を 持 た れ た 方 は，NumPy/SciPy の 公 式 HP

MATLAB，IDL，Octave，及び Scilab に匹敵するシステム［１，２］や，近年充実してきている日本語書籍［３，４］を参考にになっています．

して，より理解を深めていただければと思います．

SciPy は，以下の表に示すような多くのサブパッケージ

３．
１．
１．
１ NumPy/SciPy とは群から構成されています．

NumPy

cluster
constants
fftpack
integrateinterpolate
iolinalgndimageodr
optimizesignalsparsespatial

NumPy は"Numerical Python"の略語で，科学技術計算やデータ分析のための基本的なパッケージです．Python は
一般に，C や Fortran 等のコンパイラー型言語と比較して性能が犠牲になっています．そこで NumPy では多次元配
列 ndarray を C 言語で実装することで，使い勝手の良いイ
ンターフェイスを提供しつつも高速な演算を実現しています．特に，配列のデータをシステムのメモリ（RAM）に隙間なく配置することで，以下のような理由により高速化することができています．
・データをCPUレジスタにまとめて効率的に読み出せる・スライス，転置などの操作を実際にデータをコピーせ

ベクトル量子化／K 平均法
物理／数学定数FFT の関数
積分と常微分方程式ソルバー
内挿とスムージングスプライン
データ入出力
線形代数ルーチン
N 次元画像パッケージ
直交距離回帰（Orthogonal Distance Regression）
最適化及び解探索ルーチン
信号処理
疎行列と関連する関数
空間データ構造とアルゴリズム

Graduate School of Frontier Sciences, The University of Tokyo, Kashiwa, CHIBA 277-8561, Japanauthor’s e-mail: kenmochi@ppl.k.u-tokyo.ac.jp

１４１!2018 The Japan Society of Plasma
Science and Nuclear Fusion Research

Journal of Plasma and Fusion Research Vol.94, No.3 March 2018

special
stats
weave

３．
１．
２ NumPy/SciPy を用いた実験データ解析

任意の数学特殊関数
統計分布，統計関数
C/C＋＋統合

NumPy/SciPy を使う準備ができましたので，実際にプラズマ実験で得られたデータに対して解析をしてみましょこれらの機能を全て紹介することはできませんが，SciPy

う．ここでは，東京大学が所有する磁気圏型プラズマ装置の公式ドキュメント［２］を閲覧するか，Python のインタラ

RT-1［５］において得られた２視線のマイクロ波干渉計のクティブシェルでヘルプを表示させることで詳細を調べる

データを例にします．今回解析対象とする実験では，変化ことができます＊１．

が分かりやすいように時刻 !!2.0 sec に 5 msec 間のガスパ

NumPy と SciPy の関係

フ入射を行っています．

SciPy の Docstring の冒頭には，「SciPy は NumPy の名前

なお，今回の記事で紹介する計測データには https://

空間から全ての関数を import し，加えて以下のサブパッ

github.com/PlasmaLib/python̲tutorial/tree/master/data

ケージを提供する」ということが書かれています．つまり，からアクセスできます．ぜひ自身の PC にダウンロードし

SciPy を import すると，基本的に全ての NumPy 関数を使て，実際に手を動かして操作感を感じていただければと思えるようになります．ただし，SciPy の関数は NumPy の同います．

一関数よりも最適化されていたり，機能が拡張されている

３．
１．
２．
１ 実験データの読み込み場合が多いため，両者に関数が存在する場合には，SciPy

まずは実験データを読み込んで NumPy の配列を生成しの関数を用いるほうが計算速度の面で有利なことが多いでます．NumPy ではファイル形式にバイナリとテキストをす．

選びファイルの読み書きを行うことができますが，ここで

３．
１．
１．
２ NumPy/SciPy の利用

は np.loadtxt を使用してテキスト形式で保存されている実験データを読み込んでみます．

それでは早速，NumPy/SciPyを使っていきましょう．第１章を参考に anaconda を使って Python をインストールしIn [1]: IF = np.loadtxt(”data/IF_20170608_74_raw.

た人は，既に NumPy は入っていると思います．そこで，まtxt”, delimiter=’,’)

ずは NumPy/SciPy の有無を確認してみます．

NumPy におけるテキスト形式での読み書きには，以下のPython コンソールで特徴があります．

In [1]: import numpy

・他のアプリケーションと互換性のある.dat，.csv，.txt
In [2]: import scipy

形式のファイルの読み書きができる
・保存できる配列の次元は２次元までと打ってみてエラーがなければ無事にインストールされています．No Module Named numpy のようなエラーが出る

な お，バ イ ナ リ 形 式 の 読 み 書 き に は，np.load，np.

場合は，ターミナルで以下のコマンドを入れてインストー

save，np.savez，np.savez_compressed を使います．

ルしてください＊２．

これらの関数は３次元以上の ndarray 配列も効率的にその$ conda install numpy

まま保存できますが，扱うファイル形式（.pickle，.npz，.
npy）に他のアプリケーションとの互換性が殆どないこと$ conda install scipyに注意が必要です．バイナリ形式での読み書きに関する詳細

NumPy のインストールが完了したら，プログラム中で使は，公式 HP［６］を参照してください．

用するために import を行います．外部パッケージの使用に読み込んだデータの確認のため，Python で広く用いら関する詳細は第２章を参照してください．NumPy を importれるグラフ描写ライブラリである Matplotlib を使って，グするには，プログラム冒頭で以下のように宣言します．

ラフに表示してみます．Matplotlib の詳細は次章に譲るとIn [3]: import numpy

して，ここでは以下のように Matplotlib を読み込んでおきます．

In [4]: from numpy import *In [2]: import matplotlib.pyplot as plt

from モジュール名 import *というコードは，既にス
コープに存在する変数を知らない間に上書きしてしまう恐In [3]: plt.plot(IF)れがあります．そのため，本章では NumPy の呼び出しは

Out[3]:

In [5]: import numpy as np[<matplotlib.lines.Line2D at 0x7f67d7503dd8>,<matplotlib.lines.Line2D at 0x7f67d74ff4a8>]

In [6]: import scipy as spに統一してあります．読者の皆さんにも np.関数名での呼び出し記法を強く推奨します．
＊１ たとえば scipy.linalg のヘルプを表示させたい場合は，IPython などで scipy.linalg?と入力すればヘルプを参照することができます．
＊２ $ pip install numpy や$ pip install scipy でもインストールはできますが，conda を使うと Intel 製の高性能行列ライ
ブラリ MKL が使えるようになるため，自動的に全てのコアを使って計算してくれるようになります．

１４２

Lecture Note

3.1 NumPy/SciPy for Data Analysis

N. Kenmochi

３．
１．
２．
３ 配列の演算
データを読み込んで配列が生成できたところで，計測信号の較正値を適用して干渉計の位相信号を密度の値に変換し，そこからオフセットを差し引きます．
NumPy では ndarray で表現した行列に対して，行列の和・積，逆行列の計算，行列式の計算，固有値計算などさまざまな計算を行うメソッドや関数が用意されています．
ここで，行列計算では ndarray の＋（和），−（差），＊（積），/（除算），＊＊（べき乗），//（打ち切り除算），%（剰余）は要素同士の計算になるという点に注意が必要です．行列積を計算するには，dot メソッドを使うか，＠演算子（Python3.5 以上かつ NumPy1.10 以上）を使う必要があります．
３．
１．
２．
２ 配列の生成

今回の例では，まず較正係数を適用して信号値を位相差

次に，上図の時間軸を表示するための配列変数を作成しの値に変換します．

ます．時間軸のような等差数列の生成には，np.arange

In [7]: a1 = -0.005

や np.linespace を使用します．なお，RT-1 のマイクロ波干渉計では，時刻 !!0.5 sec から !!4.5 sec まで，サンプ

In [8]: a2 = 0.000

ル周波数 10 kHz でデータ収集を行っています．

In [9]: b1 = 0.135

In [4]: sampling_time = 1.0e-4
In [10]: b2 = 0.300
In [5]: delay = 0.5
In [11]: IF[:, 0] = np.arcsin((IF[:, 0]-a1)/b1)*
In [6]: time = npo.arange(len(IF)) * sampling_time

180/np.pi+ delay
In [12]: IF[:, 1] = np.arcsin((IF[:, 1]-a2)/b2)*

ここで，時間軸などの生成によく利用する np.arange と180/np.pi

np.linspace の使い方を簡単に紹介します．
numpy.arange

次に，位相差を線積分密度の値に変換します．

np.arange は，連番や等差数列を生成します．使い方はIn [13]: IF = IF*5.58/360

Python の組み込み関数 range と似ており，以下のように引数を取ります．なお，[]で囲んだ引数は省略できるという最後に，プラズマのない時間帯の値をオフセットとして差ことを意味します．

し引きます．

arange([start,] stop, [step,] dtype=None)

In [14]: IF -= np.mean(IF[:5000], axis=0)

start で指定した数から stop で指定した数まで，step

始めに作成した時間軸の配列とともにグラフに表示してみ間隔の数字列を生成します．第２引数 stop 以外は省略がます．

できますが，第３引数 step を指定するときは同時に第１In [15]: plt.plot(time, IF[:, 0]);

引数 start も設定する必要があります．なお，第２引数stop だけを指定した場合は，初項０で交差１の等差数列

In [16]: plt.plot(time, IF[:, 1]);を要素とする ndarray を生成します．

In [17]: plt.xlim(1.0, 3.0);

numpy.linspace
np.linspace は等差数列を生成する関数です．同様のIn [18]: plt.ylim(0.0, 2.0);関数として先程紹介した np.arange がありますが，np.

In [19]: plt.xlabel(’Time [sec]’);linspace を使用すると指定した区間を N 等分した配列を生成しているということが明確になります．

In [20]: plt.ylabel(’$mathbf{n_eL [10ˆ{17}mˆ{-2}]}$’)
Out[20]: <matplotlib.text.Text at 0x7f67da09d5c0>

linspace(start, stop, num=50, endpoint=True,
retstep=False, dtype=None)の形で使用し，生成する等差数列の始点と終点を startと stop で指定します．第３引数 num で配列の長さを，第４引数 endpointで終点を配列の要素として含むかどうかを指定します．

１４３

Journal of Plasma and Fusion Research Vol.94, No.3 March 2018

In [23]: IF[:5000, 0]Out[23]: array([ 0.,0., 0., ..., 0., 0., 0.])

この例では，配列 IF̲slice はビューですので，元の配列 IFに変更が反映されています．
他の配列指向の言語ではスライスのようなデータ片はコ
ピーとして生成する仕様のものが多いため，このインデキ
シングの仕様に驚く方は多いと思います．NumPy は，大量のデータ処理を目的として開発されてきました．ビューを用いると元のデータのコピーがメモリ上に作成されないた
め，特に大きな配列の操作に適しています＊３
ブロードキャスティング
上記で用いた IF[:5000]は，プラズマがない時間帯（５０００＋−＊/等の四則演算や，ユニバーサル関数を使って番目まで）のデータを切り出しています．このような処理

ndarray 同士の演算を行う際に，異なるサイズの２つのをインデキシング（Indexing）と呼びます．[]の中身の:ndarray を使って計算を行わなければならないことがあり

5000 で配列 IF の第０軸（この場合は時間方向に相当）のます．こういった処理を簡単・効率的に行うため，NumPy

先頭から５０００番目までの部分を示しています．

では配列演算の拡張ルールであるブロードキャスティングを採用しています．以下にブロードキャスティングの一例

切り出した配列に対し np.mean では，axis でどの軸（axis）に沿って平均を求めていくのかを決めています．今として，１次元配列と２次元配列の配列演算を紹介します

回は各 視 線 ご との 平 均 値 を 求 め る こ と が 目 的 の た め，

（図１）．

axis＝０として行方向，つまり列ごとの平均である１次#1 から 12 までの等差数列を作成し，形状を(4, 3)に変更する

元の２要素（視線１，視線２のデータ）のベクトルを求め

In [24]: b = np.arange(1, 13, 1).reshape((4, 3))ています．
IF -= np.mean(IF[:5000], axis=0)は，元のデータ

In [25]: bから上記で求めた平均を差し引く操作です．２次元データ

Out[25]:である IF と，np.mean によって求めた１次元配列との引

array([[ 1,

2,

3],

き算は，大きさが異なるため計算できないように思えま

[ 4,

5,

6],

す．その後の処理の，較正係数の引き算，除算も同様です．

[ 7,

8,

9],

実は NumPy では，ブロードキャスティング（Broadcast-[10, 11, 12]])ing）と呼ばれる仕組みにより，大きさを揃える操作を自動

In [26]: c = np.array([1, 2, 3])

的に行っています．
インデキシング# c の形状(shape) を確認する

In [27]: c.shape

上の例のように NumPy では，インデキシングという処Out[27]: (3,)

理により，配列の任意の要素・行・列を切り出すことがで

In [28]: b + c

きます．ただし，切り出し方によりコピーを生成するかOut[28]:

ビュー（参照）を生成するかという違いがありますので注意が必要です．本講座の第２章で紹介したように，Pythonのリストやタプルにも実装されているスライシング（Slic-array([[ 2,

4,

6],

[ 5,

7,

9],

[ 8, 10, 12],ing）を ndarray に対して行うと，その部分配列がビューと[11, 13, 15]])

して返ってきます．つまり，その部分配列はデータのコ
ピーではなく，元の配列の一部を参照していることになり

NumPy には，配列の全要素に対して要素ごとに演算処理ます．そのため，部分配列に対する変更はオリジナルのを行う，ユニバーサル関数が組み込まれています．ユニ

ndarray を変更してしまいます．

バーサル関数は C や Fortran で実装されており，かつ線形演算ではBLAS/LAPACKのおかげでC/C++と遜色のない

試しに，１列目の干渉計のプラズマ着火前の信号を抜きほど高速に動作します．例えば，exp 関数に配列を渡すこ

出してみます．

とで，全要素に指数関数を適用した配列を生成することがIn [21]: IF_slice = IF[:5000, 0]

できます．

IF̲slice の中身を０に変更してみます．

In [29]: np.exp(c)In [22]: IF_slice[:] = 0

Out[29]: array([2.71828183,

7.3890561 ,＊３ スライスを ndarray の実コピーとして生成する場合には，明示的に arr2d[1, 1:].copy() のようにします．

１４４

Lecture Note

3.1 NumPy/SciPy for Data Analysis

N. Kenmochi

・Python のループと条件分岐のロジックを，配列操作と真偽値の配列の操作に変換する
・可能なときは必ずブロードキャストする
・配列のビュー（スライシング）を用いてデータのコ
ピーを防ぐ・ユニバーサル関数を活用する
特に，Pyhon の言語仕様に慣れないうちは for ループを
図１

多用しがちですが，これらに気をつけると Python でも高ブロードキャスティングによる配列演算．

速で動作するプログラムを作ることができます．
３．
１．
２．
４ SciPy を用いたデータ解析

20.08553692])

時系列データの配列を作成することができたので，解析

このように，NumPy では複数の配列要素に対して処理をを行っていきましょう．今回の例では，SciPy の信号処理一度に実行できます．こうすることで，ループ構造を用いに関するサブモジュール scipy.signal の中の関数 spectro-るより圧倒的に高速に計算することができます．

gram を用いて，上記のデータに短時間フーリエ変換を施

Python のコードで良いパフォーマンスを得るには，以し，プラズマの不安定性の有無を調べてみます．

下の事が重要です．
In [30]: import scipy.signal as sig
In [31]: f, t, Pxx = sig.spectrogram(IF, axis=0, fs=1/sampling_time, window=’hamming’, nperseg=128,
noverlap=64, mode=’complex’)In [32]: plt.pcolormesh(t+0.5, f, np.log(np.abs(Pxx[:, 0]) + 1e-15));
In [33]: plt.xlim(1.5, 3.0);
In [34]: plt.xlabel(’Time [sec]’);In [35]: plt.ylabel(’Frequency [Hz]’);In [36]: plt.clim(-9, -6)

ここで，sig.spectrogram には，元のデータ IF のほか，

クロススペクトルを計算してみましょう．クロススペクト

どの次元に対してフーリエ変換を施すかを axis オプショ

ルは，以下の式で計算される量です．

ンで，サンプリング周波数や，窓関数を fs，window オプ

!
!
#
$
!!
"

ションで指定して渡しています．""2.2 sec，周波数 3〜#$はxに関するサンプル平均を表します．ここでは移動平#4 kHz あたりに何か構造があるような気もします．
もう少しノイズを除去するために，２つの干渉計信号の均で代用することにしましょう．

In [37]: def moving_average(x, N):....:

x = np.pad(x, ((0, 0), (N, 0)), mode=’constant’)....:

cumsum = np.cumsum(x, axis=1)....:

return (cumsum[:, N:] - cumsum[:, :-N]) / N

....:

１４５

Journal of Plasma and Fusion Research Vol.94, No.3 March 2018

# クロススペクトルを求める
In [38]: Pxx_run = moving_average(Pxx[:, 0] * np.conj(Pxx[:, 1]), 8)
In [39]: plt.pcolormesh(t+0.5, f, np.log(np.abs(Pxx_run)));In [40]: plt.xlim(1.5, 3.0);
In [41]: plt.clim(-19, -15);
In [42]: plt.xlabel(’Time [sec]’);In [43]: plt.ylabel(’Frequency [Hz]’)Out[43]: <matplotlib.text.Text at 0x7f67cdf55dd8>

ここで，np.conj(x)は複素共役を求めるユニバーサル関

す．np.c_や np.r_に つ い て 更 に 詳 し く 知 り た い 場 合

数で，配列の要素ごとに適用されます．移動平均を取る関は，docstring 等を参照してください＊４．なお他にも，np.

数 moving_average の説明は省略しますが，スライシン

concatenate，np.hstack，np.vstack などの関数を用

グと累積和を用いることで効率よく計算しています．

いても配列の結合を行うことができます．

上記操作により，3〜4 kHz 付近の構造を可視化することを用いることで，スペクトル解析を簡単・高速に行うこと

３．
１．
３ SciPy を用いた Predator-Prey モデルのシ
ミュレーション

ができます．Matplotlib で描画することで，その結果をす

本章の最後に，SciPy を用いた微分方程式の解法例としができました．このように，NumPy/SciPyの既存のツール

ぐに可視化しながら高速に解析を進めることができるでて，Predator-Prey モデルのシミュレーションについて紹

しょう．

介します．

３．
１．
２．
５ 解析データの書き込み

帯状流と乱流の相互作用は，捕食者−被食者（Predator-

最後に，物理量に変換した配列を時間軸と一緒にテキス

Prey）モデルで記述されることが知られており［７］，このト形式で保存します．
In

[44]:

np.savetxt(’time_IF.txt’,

モデルは１階の連立微分方程式の形をしています．SciPy
パッケージの odeint モジュールを使うと，１階の常微分方

np.c_[time,

程式の数値解を簡単に得ることができます＊５．odeint はIF], delimiter=’,’)LSODA（Livermore Solver for Ordinary Differential equa-

ここでは，配列の結合に np.c̲というオブジェクトを使用

tions with Automatic switching for stiff and non-stiff prob-

しています．np.c̲は axis=1 の方向（２次元の場合は列

lems）法を利用した汎用的な積分 器 で す が，詳 し く は方向）に，np.r_は axis=0 方向（２次元の場合は行方向）ODEPACK Fortran library［８］を参照してください．

に配列を結合します．どちらも関数ではなくオブジェクト

まずは，ソースコードを見てみましょう．

なので，全て[]の中に配列や値を入れて操作していきま
1 #!/usr/bin/env python
2 ¥PYGZdq¥PYGZdq¥PYGZdq
Sample Code3

＊４ IPython などで np.r_?と呼び出して docstring を確認することができます．
＊５ なお，高階の微分方程式でも，１階の微分方程式に変換することで odeint を用いて計算することができます．

１４６

Lecture Note

4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73

3.1 NumPy/SciPy for Data Analysis

Status-----Version 1.0
Authour------Shigeru Inagaki
Research Institute for Applied Mechanics
inagaki@riam.kyushu-u.ac.jp
Revision History---------------[11-April-2017] Creation
Copyright--------2017 Shigeru Inagaki (inagaki@riam.kyushu-u.ac.jp)
Released under the MIT, BSD, and GPL Licenses.
”””
import numpy as np
import scipy.integrate as desol
import matplotlib.pyplot as plt
def predator_prey(f, t, a, b, c, d):””” return left hand sides of ordinary differential equations
model equation:
dx/dt = ax - bxydy/dt = cxy - dy
f[0]- x: Population of preyf[1]- y: Population of predatort- Timea,b,c,d - Control parameters”””
return [a*f[0]-b*f[0]*f[1], c*f[0]*f[1]-d*f[1]]#model#eq1 = r”$fracdxdt = ax - bxy$”#eq2 = r”$fracdydt = cxy - dy$”eq1 = r”$dx/dt = ax - bxy$”eq2 = r”$dy/dt = cxy - dy$”
#input parameters
a = 1.0
b = 1.0c = 1.0
d = 1.0
header = r”$a=0:.1f, b=1:.1f, c=2:.1f, d=3:.1f$”.format(a, b, c, d)#initial condition
f0 = [1.0, 0.1]
#independent variable
nt = 1000
tmax = 30.0
dt = tmax / nt
t = dt * np.arange(nt)f = desol.odeint(predator_prey, f0, t, args=(a,b,c,d))#plot
prey = f[:,0]predator = f[:,1]fig = plt.figure()ax = fig.add_axes([0.15, 0.1, 0.8, 0.8])

１４７

N. Kenmochi

Journal of Plasma and Fusion Research Vol.94, No.3 March 2018

74
75
76
77
78
79
80
81
82
83

ax.plot(t, prey, color=’r’, label=r”$x$: prey”)
ax.plot(t, predator, color=’b’, label=r”$y$: predator”)
handles, labels = ax.get_legend_handles_labels()
ax.legend(handles, labels, loc=’best’)ax.text(21, 2.7, eq1, fontsize=16)
ax.text(21, 2.5, eq2, fontsize=16)
ax.set_xlabel(”Time”)
ax.set_ylabel(”Population”)
ax.set_title(header)plt.show()プログラムの内容は以下のようになっています．

本を理解することが Python を用いた科学技術計算にとっ１．解析する関数（この場合 predator̲prey）を定義するて重要です．本章で紹介したNumPyにおけるndarrayやユ・第１引数 f が微分方程式中の未知関数

ニバーサル関数，ブロードキャスティングの概念は Py-

・第２引数 t が関数のパラメータ（時間に対応）

thon の機能を大幅に拡張しており，これらの概念に慣れる

・第３‐６引数 a，b，c，d が定数

ことがプログラミングの効率を大きく向上させます．さら・戻り値がパラメータ t における dx/dt，dy/dt を与えに，SciPy を用いることで NumPy の機能の上に構築されたる

様々な科学技術計算アルゴリズムを利用できます．SciPy

２．微分方程式の定数 a，b，c，d を与える

は非常に巨大なパッケージですので，効率良く計算を進め

３．微分方程式の初期値 f０を与える

るため，処理を実装する前に SciPy で既に実装されていな

４．未知関数の解析範囲（時間）を与えるパラメータ列 t

いかどうかぜひ確認してみてください．

を用意する

科学技術計算において，特に解析対象や解析方法がその５．関数 scipy.integrate.odeint に１‐４を引数にして都度変化するプラズマ実験では，実験条件に対応して柔軟呼び出すにコードを組まなければなりません．例えば，数分間の実６．戻り値がパラメータtに対応する未知関数fの各値とな

験周期中に直前のプラズマ放電で得られたデータを解析る

し，それを基に次の放電の条件を決めるといった場合，非帯状流とプラズマ乱流の相互作用を当てはめて考えてみ

常に短時間にコードを組んで解析を進めることが要求されると，乱流を餌として発生・成長する帯状流は捕食者の役

ます．こういった状況では，実行速度よりも開発速度が重割を，またプラズマ圧力勾配により発生する線形不安定性

要になることが多く，Python はその用途に適しています．

を源として成長する乱流は被食者の役割を果たします．

本講座で Python の使い方を一通り覚えたら，まずは自このように Python を用いることで，簡単にモデルの計身の研究でも試してみてください．すぐに Python の柔軟

算と可視化をすることができます．コーディングの時間を性や開発のスピード感を味わってもらえると思います．

短縮し，試行錯誤に多くの時間を割けるのが Python の利

参考文献

点でもありますので，みなさんもまずは簡単なプログラムを作成し，動作を確認してみてください．

［１］http://www.numpy.org［２］https://www.scipy.org［３］Wes McKinney：Python によるデータ分析入門（オライリー・ジャパン，２
０
１
３）
．

３．
１．
４ まとめ
本章では，NumPy/SciPyの特徴と基本的な使用法，簡単［４］中久喜健司：科学技術計算のための Python 入門（技術
評論社，２
０
１
６）
．

なシュミレーションの例を紹介しました．NumPy が他の多くのライブラリの基礎となっているため，NumPy の基
１４８

Lecture Note

3.1 NumPy/SciPy for Data Analysis(2016).
［８］http://people.sc.fsu.edu/〜jburkardt/f77̲src/odepack/odepack.html［５］Z.Yoshida et al., Phys. Plasmas, 17, 112507 (2010).
［６］https://docs.scipy.org/doc/numpy-1.13.0/reference/routines.io.html［７］小 林 す み れ 他：プ ラ ズ マ・核 融 合 学 会 誌 92, 211!!!!!!!!!!!!!!!!!

けん

もち

なお

き

１
９
８
７年静岡県浜松市生まれ．東京大学大学
院新領域創成科学研究科 助教．２
０１
１年京都大学工学部物理工学科卒業．２
０
１
６年同大
学院エネルギー科学研究科博士後期課程修了．博士（エネルギー科学）．学生時代は京都大学 Heliotron
J で，現在は東京大学 RT‐
１装置にて熱・粒子輸送を研究．両装置でトムソン散乱計測装置開発に従事．趣味は空手（京都大学空手道部コーチ）．最近，生命保険に加入したが，空手が危険スポーツとみなされ保険料が大幅に上がってしまった．

!!!!!!!!!!!!!!!!!

!!!!!!!!!!!!!!!!!!!!!!!!!!

釼 持 尚 輝N. Kenmochi!!!!!!!!!!!!!!!!!!!!!!!!!!

１４９

J. Plasma Fusion Res. Vol.94, No.3 (2018)１
５０‐１６１

講座 今日からはじめる Python

３．Python による科学技術計算
3. Scientific Computing in Python

３．
２ matplotlib の使い方
3.2 How to Use matplotlib
吉沼幹郎
YOSHINUMA Mikirou
核融合科学研究所（原稿受付：２
０
１
８年１月２
３日）

Python を用いて，データをグラフに描画するときに利用される matplotlib というモジュールの使い方を説明します．このモジュールを利用することで，Python を用いた行われた計算の途中や結果の数値を確認することが簡単にできるようになります．また，論文掲載用の図として利用できる品質のさまざまなグラフを描画することができます．ここでは，簡単な２次元データの散布図から，凡例表示やエラーバーの表示方法，３次元データのヒートマップの表示について説明します．
Keywords:
Python, matplotlib, data visualization, graph, control plot３．
２．
１ はじめにを呼び出す方法（関数インターフェース）があります．前

Python を用いて，実験データの解析を行うとき，ある者の方法は，記述が増える代わりに，matplotlib のすべて

データのセットに対して，Python で記述されたなにかのの機能を使うことができます．Python で構築するアプリ

処理を適用して，結果を得るということを繰り返します．

ケーションソフトウェアに matplotlib を組み込んで使う場

そのよなとき，得られた結果をグラフとして描画したいと合に便利です．後者の方法は，記述が少なくなるため，思うことでしょう．数値をファイルに書き出し，グラフ描

Jupyter などのインタラクティブな環境で使うときに便利

画ソフトウェアで読み込み，描画するという手順を踏んでです．

もよいのですが，処理の途中経過などは，いちいちファイ

Python のモジュールを利用するためには，利用したい

ルに書き出すのを面倒に感じます．ここでは，そのようなモ ジ ュ ー ル を イ ン ポ ー ト す る 必 要 が あ り ま し た．

状況でも便利に利用できる，Python で取り 扱 っ ている

matplotlib というモジュールは，複数のモジュールファイ

データから直接グラフを描画できる matplotlib モジュール

ルで構成されており，どれをどのようにインポートしたらの使い方を紹介します．matplotlib は，Python でグラフをよいか分かりにくいかもしれません．グフラフ描画に利用

描画するときに利用される標準的なモジュールとなっておされるものが matplotlib.pyplot というモジュールです．しり，二次元の散布図からヒートマップなど様々なグラフをばしば，スクリプトの冒頭で‘import matplotlib.pyplot as

描画することができます．matplotlib のホームページのplt’と 記 述 さ れ イ ン ポ ー ト さ れ て い ま す．こ れ は，

ギャラリーでは，どのようなグラフが描画できるのか一覧

matplotlib.pyplotモジュールをpltという名前でインポート

できます．

することを意味します．このようにすると，matplotlib.

matplotlib は，グラフ描画に使われる要素（オブジェク

pyplotに含まれる関数，例えば，plot()やshow()などが，’plt.

ト），例えば軸や線やラベルといったものが詰まったもの

plot(...)’や’plt.show()’のように，モジュール名’plt.’をつけてで，それらを適切に設定，操作することで，グラフ全体を記述することで呼び出すことができます．matplotlib には，構成します．matplotlib で，それらのオブジェクトを操作

MATLAB と互換性のある関数名を使いたい人のためにするには，オブジェクトごとに持っている操作手続き（メmatplotlib.mlab モジュールも用意されています．

ソッ ド）を 直 接 呼 び 出 す 方 法（オ ブ ジ ェク ト イ ン タ ー

ここではインタラクティブな環境を利用することを考フェース）と，オブジェクトの操作手続きを代行する関数

え，pylab というモジュールをインポートして関数イン

National Institute for Fusion Science, Toki, GIFU 509-5292 Japanauthor’s e-mail: yoshinuma@nifs.ac.jp

１５０!2018 The Japan Society of Plasma
Science and Nuclear Fusion ResearchLecture Note

3.2 How to Use matplotlib

M. Yoshinuma

ターフェースを使うスタイルで説明していきます．そこ

ファイルを用意する必要はありません．ぜひ，リストにあで，スクリプトの冒頭には，‘from pylab import *’と記述しるスクリプトを入力，改変して，動きを確認していただきて い ま す．こ の よ う に pylab モ ジ ュ ー ル を import す る

たいと思います．

と，matplotlib.pyplot,matplotlib.mlab,numpy モジュールに３．
２．
２ はじめの一歩含まれる関数を，モジュール名無しに，関数名だけで使えるようになり，記述量が少なくなります．ただし，このよ

まず，インタラクティブな環境を起動して List １にある

うにモジュール名を省略すると，異なるモジュールにおいものを実行してみましょう．説明のため，余計な線や文字て同名の関数がある場合に上書きされてしまう問題が起こが入っていますが，図１に描画結果を示します．"a"というりますので注意が必要です．同名の関数や変数があるかど

名前の配列に−1 から 1 まで 0.1 刻みの数値を設定（２行目）

うかは，インタラクティブな環境でその名前を評価してみし，その内容をグラフにプロット（３行目）するものです．

るとわかりますので，疑わしいときは確認するとよいで

plot()関数に与えた a という配列の値が y 軸の値としてプ

しょう．ここでは，気軽にスクリプトを入力して試していロットされています．配列一つを plot()関数に与えると，x

ただくために，記述量が少なくなるスタイルをとりました

軸の値は配列のインデックス番号が使われます．このようが，関数などの出所を明確にするためにも，モジュール名に配列にどのような値がはいっているかを簡単にグラフにを省略しないスタイルをお勧めします．

して確認することができます．数値列を生成する arange()

matplotlib によるグラフ描画の説明には，プロットする

関数は numpy モジュールによって提供されていますが，データが必要です．プロットするデータはすべてスクリプ

pylab モジュールを１行目の記述で import したことで，モト内で手短に生成していますので，試すために，データ

ジュール名を省略して利用できるようになっています．

List 1：pylab のインポートと配列内容のプロット

図１

List 1 による描画結果と図（Figure）の構成要素．

図１を見ながら，グラフを描画するときのいくつかの重関数によって，グラフ枠（Axes）内にデータ点をプロット

要な構成要素について説明します．グラフが描画されていし，show()関 数 に よ っ て，グ ラ フ 枠 が 配 置 さ れ た 図る領域全体が Figure と呼ばれる要素です．本文では「図（Figure）を描画します．図（Figure）やグラフ枠（Axes）（Figure）」と 書 く こ と に し ます．matplotlib で は この 図は自動的に作成され，操作の対象となる図（Figure）やグ（Figure）にグラ フ を 描 画 し，そ れ を 表 示 さ せ ます．図ラフ枠（Axes）も自動的に決められます．関数を呼び出し（Figure）の中には，x 軸，y 軸で囲まれた四角の領域があた結果は，現在対象になっている図（Figure）やグラフ枠

ります．本文では，「グラフ枠（Axes）」と書くことにしま（Axes）に現れます．ですから，現在対象になっている図

す．グラフ枠（Axes）は x 軸，y 軸によって構成され，そ（Figure）やグラフ枠（Axes）というものを意識して操作の中にデータ点がプロットされます．グラフ枠（Axes）

するとよいでしょう．

は，図（Figure）の中に一つ以上配置することができます．
関数を呼ぶスタイルで matplotlib を利用する場合，plot()
１５１

Journal of Plasma and Fusion Research Vol.94, No.3 March 2018

３．
２．
３．
１ データ点をプロットしてみる

３．
２．
３ (x, y)データをプロットする
こ こ で は 単 純 な xy 散 布 図 の グ ラ フ 描 画 を 通 し て，

単純 な ガ ウ ス 分 布 関 数 を プ ロ ッ ト し て み ま し ょ う．
List ２を実行してみてください（図２）．

matplotlib の各種操作を説明していきます．

List 2：ガウス分布関数

図２

List 2 による描画結果．

２行目，３行目でプロットするデータの配列 を 作り，破線，点線，一点鎖線は，それぞれ‘-’，‘--’，‘:’，‘-.’で指定

xdata，ydata としています．それらを plot()関数の１番目のします．マーカーで点を打ち，さらに線で結びたいときは，引数，２番目の引数としてそれぞれ与えます．plot()関数にこれらを組み合わせます．例えば，丸でプロットして，点渡す３番目の引数で，プロットに用いるマーカーを指定し線で結びたいときは，‘o:’という文字の列を三番目の引数ます．アルファベット小文字の‘o’を渡すことで，塗りつぶに渡します．マーカーのサイズは，markersize（あるいはされた丸記号を指定しています．注意していただきたいのms）というキーワード引数を使って指定できます．キー

は，plot()関数の引数は，前の章で配列を一つ与えたときとワード引数とは，Python の関数で用いられる引数の種類は異なっています．このように，同じ関数でも，引数の与の一つで，順不同に渡せるばかりでなく，渡さなかった場

え方に応じて適切に振る舞いが変化するものもあります．

合にデフォルトの値が使われるため，指定しなくてもよい

３．
２．
３．
２ マーカーや線種の指定とオーバープロット

引数です．線の太さは，linewidth（lw）というキーワード引

plot()関数に渡す三番目の引数でマーカーを変更するこ数を使って指定できます．いくつかマーカーとマーカーのとができました．この指定に使われる文字は，インタラク

サイズ，線種を変えてプロットしてみます．plot()関数の呼

ティブな環境で‘help(plot)’を実行すると表示される説明でび出しを重ねるとデータをオーバープロットできます

読むことができます．丸●，三角▲，四角■，ダイヤ◆の（List 3，図３）．

記号は，それぞれ‘o’，‘^’，‘s’，‘D’で指定します．実線，
List 3：マークを変えてオーバープロット

１５２

Lecture Note

3.2 How to Use matplotlib

図３

M. Yoshinuma

List 3 による描画結果．

３．
２．
３．
３ 色の指定をお勧めします．RGB の１
６進数文字列とは，００（１０進数でplot()関数を繰り返し呼び出してオーバープロットする０）か ら FF（１０進 数 で２５５）の 大 き さ で 赤（Red），緑と色が自動的に変わっていきます．自分で色を指定したい（Green），青（Blue）の各色の強さを指定する方法です．先ときは，plot()関数を呼び出すときに color（あるいは c）と頭に‘#’をつけて，例えば赤なら‘#FF００００’となります．白

いうキーワード引数に色を示す値を渡します．色を示す値

は，RGB 各色が最大値ですので，‘#FFFFFF’となります．

には，色の名前，色を表す１文字，RGB（A）の１６進数文字

一方，黒は各色が最小値の‘＃００００００’となります．List 4

列，RGB（A）の値をもつ tuple などいろいろあります．ここにいろいろな方法で色を指定した例を示します．最後の例

で（A）と書きましたが，これは透明度を指定するアルファのように色を１文字で指定する場合，スタイル指定の文字

チャンネルの値も指定できるからです．色を表す１文字に列に含めてしまうこともできます．手早く色を変えてプは，‘b’，‘g’，‘r’，‘c’，‘m’，‘y’，‘k’，‘w’の８文 字 が あ

ロットしたいときは，こちらの指定が楽でしょう．マーり，そ れ ぞ れ 青（blue），緑（green），赤（red），水 色

カ ー 内 部 の 色，境 界 の 色 は そ れ ぞ れ markerfacecolor（cyan），赤紫（magenta），黄（yellow），黒（key），白（mfc），markeredgecolor（mec）というキーワード引数に（white）に対応します．色の名前は多くありますが，実際色を指定する値を渡すことで個別に設定できます．これをの色をイメージすることは難しいので，先の８文字以外の用いて，白抜きや中抜きのマーカーを利用することもでき色を使いたい場合は，RGB の１
６進数文字列で指定することます（List 4，図４）．

List 4：さまざまな色指定の方法

図４

List 4 による描画結果．

１５３

Journal of Plasma and Fusion Research Vol.94, No.3 March 2018

３．
２．
３．
４ 軸の設定は，目盛りを振る位置を数値の配列にして渡します．第二

リスト List 5 と図５に，軸の目盛りや範囲を設定する例

引数に，文字列のリストを渡すと，目盛りのラベルにそのを示します．matplotlib では，図（Figure）をディスプレイ

文字列が使われます．例では，目盛り位置は，arange()関数に表示する前，すなわち show()関数を呼ぶ前に設定を済まを用いて生成しています（６行目，７行目）．y 軸のラベルせておく必要があります．

は，目盛り位置（yticks̲positions）の数値を’%4.3f’（小数４行目の tick̲params()関数によって，軸に目盛りや目盛点以下３桁）でフォーマットした文字列のリストを第二引りのラベル描画をさせるかの設定ができます．right キー

数に渡しています．９，１０行目の xlim()，ylim()関数によっ

ワード引数，top キーワード引数に True を設定することて，それぞれ x 軸の範囲，y 軸の範囲を設定します．第一引で，x 軸，y 軸の対向側にも目盛りを振るようにしていま数に下限値，第二引数に上限値を指定します．軸の方向はす．directionキーワード引数に’in’を設定することで，目盛下限値，上限値の大小関係によって適切に変化します．各りをグラフ内側に向けて描画するようにしています．５行

関数のパラメータの詳細については，plot()関数のときと同目の grid()関数によって，目盛りにあわせて格子状の線を様に，インタラクティブ環境で help（関数名）を実行す

描画させます．６行目，８行目の xticks()関数，yticks()関数

ることで読むことができます．

によって，目盛りを振る場所を指定できます．第一引数にList 5：軸の範囲とラベルの設定

図５

List 5 による描画結果．

数式表記も利用できます．List 6 では，タイトルの文字列

３．
２．
３．
５ タイトルと凡例の表示
List 6 と図６に，グラフタイトル，軸のラベルや凡例のとして，r’Function...’のように文字‘r’をつけています．こ
表記ではしばしば‘!
’
この例では使用していませんが，表示を行う例を示します．４，５行目の xlabel()，ylabel()

文字（機種によっては‘¥’文字）を利用します．Python では
文字列の表記中の‘!
’文字は，特別な文字（例えば改行やタ関数によって，それぞれ x 軸のラベル，y 軸のラベルを設定します．ラベルとして書き出す文字列を第一引数に指定しされたデータと凡例に表示する文字を一致させるために，

ブ文字）を表記するために使われます．また，‘!
’文字を表記するためにも使われるため，文字列データの中に‘!
’文字

plot()関数を呼び出すときに，キーワード引数 label に凡例!
を入れたいときは‘!
’のように二回書く必要があります．文として 表 示 さ れ る文 字 列 を 設 定 し て い ます．８行目の

字 列 の 前 に‘r’文 字 を つ け る と 書 い た も の を そ の ま まlegend()関数で凡例を表示させる指示を行いますが，凡例

Python の文字列データとすることができます．ですからとして使用される文字列が指定された後，すなわち plot()

このような記述をしておくと，を行った後に行います．９行目で title()関数によってタイ

すくなります．文字の大きさは，xlabel()，ylabel()，title()，形式のlegend()関数の fontsize キーワード引数に数値を設定する

ます．６，７行目でデータをプロットしています．プロット

トルの文字列を設定しています．文字列には，

１５４表記の文字列を書きやLecture Note

3.2 How to Use matplotlib

M. Yoshinuma

ことで，変更することができます．legend()関数には，表示

numpoints＝1 を指定して，凡例におけるマーカーの数を設定のためのキーワード引数が多く存在します．例では１つに設定しています．

List 6：凡例を表示

図６

List 6 による描画結果

３．
２．
３．
６ y２軸の利用

ロットです．１
１行目で twinx()関数を呼び出しています．

異なる値を同じ x 軸上にプロットしたい場合，x 軸を共twinx()関数を用いると，x軸を共有した 新しいy軸 （＝y2

通にして，y 軸をもうひとつ増やしたいことがあります．

軸）をもったグラフ枠（Axes）ができ，操作対象が新しく

もう一つの縦軸をy2軸とここでは呼ぶことにします．グラ

できたグラフ枠（Axes）に変化しま す．y2 軸 は twinx()を

フ枠の左側の枠線が y 軸に用いられ，y2 軸は y 軸の反対側行った後で作られますので，その範囲設定，ラベル設定，（右側）の枠線に描かれます．

y2 軸上へのプロット，レジェンドの描画は，その後で行いList 7 および図７に y2 軸を利用する例を示します．５行

ます．

目から９行目までは，これまで行ってきた x-y 軸へのプ
List 7：y２軸を使う

１５５

Journal of Plasma and Fusion Research Vol.94, No.3 March 2018

図７

List 7 による描画結果．

３．
２．
３．
７ 一つの図に複数のグラフを描く

成します．３行２列，合計６枚のグラフ枠（Axes）を並べしばしば，複数のグラフを用いて異なる物理量を同時にたい場合，subplot()関数の第１引数に行数の３を，第２引載せることもあります．グラフを一つ一つ作成しておい数に列数の２を与え，第３引数に，どの位置のグラフ枠て，あ と で 合 わ せ る こ と も で き ま す が，こ こ で は（Axes）を作成するかをインデックス番号で指定します．

matplotlib で一つの図に複数のグラフを描く方法を説明しインデックス番号は図８のように，まず行方向に変化しまます．

す．４番の位置にプロットしたいなら，subplot(3, 2, 4)とす

複数のグラフを作る場合，それぞれにグラフ枠（Axes）

ると，その位置に描画されるグラフ枠（Axes）が作成さを作成する必要があります．これまで行った twinx()関数もれ，それが操作対象になります．また，行数，列数，イン

新たにグラフ枠（Axes）を作成する効果がありました．こデックスが１０より小さい場合，それらを一つの引数にまとこでは subplot()関数を用いて新たにグラフ枠（Axes）を作

めて subplot（３２４）のように指定することもできます．

図８

subplot()関数によるレイアウトとインデックス番号．

List 8 および図９に１行２列のレイアウトでプロットす

まかに変えることができます．h̲pad，w̲pad というキーる例を示します．５行目で左側のグラフ枠（Axes）を作成

ワード引数にフォントサイズを基準にした値を設定しましています．６行目で枠の上と右側にも目盛りを振るようす．たとえば，横方向の間隔を２文字分ほど広げたいならに，tick̲params()関数で設定しています．１
１行目で右側のw̲pad＝2.0 とします．位置の調整には，subplots̲adjust()

グラフ枠（Axes）を作成しています．こちらの枠は，左側関数も使うことができます．subplots̲adjust（wspace＝の目盛りの数値を表示させな い よ う に，１
２行 目 の tick̲

0.0，hspace＝0.0）とするとグラフ同士が密着します．ここparams()関数で labelleft=False を設定しています．１
５行目

でキーワード引数 wspace,hspace には，それぞれグラフのの tight̲layout()関 数で グ ラ フ 枠 の 間 隔 を 調 整 し て い ま

x 軸の幅，y 軸の幅を基準とした値を渡します．

す．この tight̲layout()関数を使うと，各グラフの間隔を大１５６

Lecture Note

3.2 How to Use matplotlib

M. Yoshinuma

List 8：subplot()関数を用いた１行２列のレイアウト

図９

List８の描画結果．

３．
２．
３．
８ 図（Figure）の大きさの変更と保存 Change size

設定しています．６行目の savefig()関数によって，画像of figure and save to file

ファイルとして保存しています．第一引数に出力ファイル

これまで自動的に作成されるデフォルト設定の図名を指定します．拡張子によって自動的に画像形式が変換（Figure）
を 利 用 し て き ま し た が，figure()関 数 を 用 い る

されます．拡張子は，‘.png’，‘.svg’，‘.eps’というところと，大きさを指定して図（Figure）
を作成することができまがよく使われるものでしょう．保存と表示を行いたい場合

す．この関数を使うと，操作対象が新たに生成された図は，savefig()関数を使ってから show()関数を使ってくださ（Figure）に切り替わります．List 9 には，８インチ×６イ

い．例では，カレントディレクトリ（現在の作業ディレク

ンチの画像を 100 dpi で png（Portable Network Graphics）

トリ）に‘output̲gauss.png’という名前で画像ファイルが形式で 保 存 し，ま た表示 す る 例 を 示 し ま す．４行 目 の作成されますので，同名のファイルがないことを確認して

figure()関数の figsize キーワード引数にサイズを表す（８，６）

から実行してください．

のタプルを設定しています．dpi キーワード引数に，１００をList 9：図の保存

３．
２．
４．
１ 誤差棒のついたグラフ Plot with error bars

３．
２．
４ いろいろなプロット

誤差棒のついたグラフを描画するには errorbar()関数をここまで，matplotlib で単純な散布図を描画して，軸の使います．第１引数，第２引数にそれぞれ x，y のデータを範囲を設定したり，ラベルを付けたりしてきました．次に，渡すのは，plot()関数と同じです．errorbar()関数には誤差

誤差棒のついたプロットやヒートマップをプロットする方の値を渡すキーワード変数 xerr と yerr があります．x 軸方法を紹介します．

向の誤差は xerr に，y 軸方向の誤差は yerr に渡します．また，マーカーの指定には，キーワード変数 fmt を用います．
１５７

Journal of Plasma and Fusion Research Vol.94, No.3 March 2018

誤差棒の描き方を指定するためにキーワード変数 capsize,

で誤差棒両端の線の長さを，capthick で誤差棒両端の線のcapthick,elinewidth があります．工字型の誤差棒を表示し太さを，elinewidth で誤差棒の太さを指定できます．List

たい場合は，capsize を適切に指定してください．capsize

10 に例を示します．

List 10：誤差棒のついたグラフ

図１
０ List 10 の描画結果．

３．
２．
４．
２ 等高線のプロット

Contour plot

できます．

ここから３次元のデータ（二次元の配列に大きさが入っ

等高線にラベルをつけるには，プロットした等高線オブたもの）のプロットをしていきます．３次元プロットのたジェクトを clabel()関数に渡す必要があります．contour()めのデータを二次元配列で与えるときに混乱しやすいの関数は，等高線をプロットした後，等高線オブジェクトを

は，x 軸，y 軸方向と２次元配列の行方向，列方向の関係で返してきますので，それを cntr 変数に保持して（６行目），

す．向きが分かりやすいように，x 軸方向に非対称，y 軸方

clabel()関数に渡しています（７行目）．ラベルの書式の設向に対称な !
$!
%$$$%$という関数の値を z と
$
%#
&'#
#
"'
!#

定は clabel()関数のキーワード引数 fmtに，Pythonの書式指してプロットしてみます．

定文字列（C言語と似ています）を渡すことで行います．例

等高線は，contour()関数を用いて描きます．等高線の間では，小数点以下２桁の表示を指定しています．

を塗りつぶす contourf()関数もありますが，おおよその使

contour()関数には，他にも設定があります．colors キー

い方は contour()関数と同じです．contour()関数には２次元ワード引数に色の指示値を与えると，その色が順番に使わの配列を一つ渡すと，x 軸，y 軸はそれぞれは列方向，行方れますが，一つだけ渡すと単色で線を引くことができま

向のインデックス番号が使われます．２次元配列のデータ

す．詳しくは，matplotlib ホームページのギャラリーを見を確認するときには便利かと思います．よく行うのは，x，て調べるとよいでしょう．

y，z の３次元データを与えて，等高線を描かせることでしょう．
式（１），（２）で示される $,%のリストに対して，&の二次元配列をどのような並びで作成するかを式（３）に示し

$"%
$
$
$
'!
#&
!!
"!

（１）

%"%
%
%
%
'!
"&
!!
"!

（２）

&"%
!
$
!
!
$
!
%
%
%
#
#
!!
!$
"!
!$

ます．配列 $
，配列 %の要素数がそれぞれ &の列数，&の行

!
$
!
!
$
!
%
%
%
#
#
!!
"$
"!
"$
'

数に一致する必要があります．すなわち行方向が y 軸の方向，列方向が x 軸の方向に な り ま す．contour()関 数の x

!
$
!
!
$
!
!
$
%
%
%
%
#
#
'!
#
&
&
"$
"$
#!
"$
!!
"!

"，%
" のような２次元と y には，式（４），（５）に示す $

（３）

$
""%
$
!
$
$
%
'!
#&
!!
"!

配列を渡しても問題ありません．
データを作成する箇所が重要な場所です．(，)のリストか

$
!
$
$
%
'!
#&
!!
"!
'

"，%
" のようなリストを作成する関数が meshgrid()
ら$

$
$
$
%
&
'!
#&
!!
"!

List１１にプロットした例を示します．contour に与えるです．levels キーワード引数には，線を引くレベルを指定
１５８

（４）

Lecture Note

3.2 How to Use matplotlib

M. Yoshinuma

(

%
##&
%
!
%
%
&
(!
!!
!!
!'
%
!
%
%
&
(!
"!
"!
"'

%
%
%
&
'
(!
#!
#!
#'

（５）

List 11：等高線のグラフ

図１
１ List 11 の描画結果．

３．
２．
４．
３ ヒートマップのプロット

Heat map

プを描画しました（図１３左，List 13）．同時に等高線図も(x, y, z)の値の分布を色の変化で示したい場合にヒート

描画し，$
$
!
%%
!
!
!%付近を拡大しています．この図のよ#$マップが用いられます．ヒートマップのプロットには，うに，色と等高線がずれて見えます．これは，メッシュ内

pcolormesh()関数を使います．例を List１２および描画結果の色が，そのメッシュの左下の値に応じた色で塗られていを図１２に示します．ほぼ，前節のcontour()関数の代わりに，るためです．メッシュの値と塗りの中心をあわせたい場合

pcolormesh()関数を使うだけです．キーワード引数 cmapには，塗りに使われるメッシュを計算に使われたメッシュに，カラーマップ（値と色を対応させるもの）を指定しま

サイズの半分だけシフトさせる必要があります．List 13

す．カラーマ ッ プ の名 前 は，よ く 使 わ れ る も の で‘jet’，の６行目，７行目でずらしたメッシュ位置を作成し，２０行‘hot’,‘rainbow’などがあります．色と値の対応を示すため

目の pcolormesh()関数に渡しています．注意していただきに，同時にカラーバーを描画することが一般的です．カ

た い の は，こ の pcolormesh()に 渡 し て い る shifted̲x とラーバーは，colorbar()関数に，対象となるヒートマップを

shifted̲y は，pcolormesh()でヒートマップの表示をずらし

渡 す こ と で 描 画 できます．対 象 となるヒートマップは，て適切にするために渡しているだけで，ここで渡している

pcolormesh()関数で描画したときに得られます．７行目で，zm の値は，あくまでも xm，ym の位置で計算したものでpcolormesh()で得られたヒートマップを hmap に保存してあることです．（ずらした後の位置（shifted̲x，shifted̲y）

おき，８行目で colorbar()関数に渡しています．colorbar()で計算したものではありません．）

関数からは，描画したカラーバーが得られます．９行目で６行目，７行目のずらした位置を得るところについて少は，８行目で得られたカラーバー cbar からカラーバー自身

し説明します．’r̲’は，numpy モジュールが提供するオブのグラフ枠（Axes）を取り出して，y 軸のラベルを設定すジェクトで，r̲[a, b, c]とするとオブジェクトの機能（メる機能を呼び出してカラーバーにラベルを設定しています．

ソッド）によって，a，b，c，を行方向へ連結した配列を返

このプロットでは気が付かないかもしれませんが，描画してくれます．式を見ると，x(y)の２番目の要素から最後範囲を狭めてメッシュが拡大されると，色の塗り方に問題まで，間隔の半分を差し引いてずらしています．その先頭が 現 れ ま す．わ か り や す い よ う に，関 数 をと 最 後 に，x(y)の 先 頭 の 要 素 x[0](y[0])と 最 後 の 要 素!$$#"%#%

"
$
!
%%
$
#!

をzとしてpcolormesh()関数でヒートマッ

x[-1](y[-1])を連結させ付け加えています．

１５９

Journal of Plasma and Fusion Research Vol.94, No.3 March 2018

List 12：ヒートマップによる表示

List 13：メッシュをずらす

図１
２ List 12 の描画結果．

図１
３ List 13 の描画結果．

３．
２．
４．
４ 色付き散布図のプロット Scatter plot with color

渡します（図１４）．マーカーに渡す値については，plot()関depend on values

数を参考にしてください．例では，‘o’を渡して，丸を用いz の値に応じて，色を変化させた散布図を描きたいことています．マーカーの大きさは，キーワード引数 s に pointもあります．その場合は，scatter()関数を使います．例をの二乗の単位で指定します．すなわち，１０point のマーカー

List１４に示します．プロットする位置の座標 x，y をそれぞ

なら１００を s に渡します．範囲やカラーマップについて

れ第１引数，第２引数に渡します．キーワード引数 c に zは，pcolormesh()関数と同じです．

を渡します．キーワード引数 marker にマーカーの種類を

１６０

Lecture Note

3.2 How to Use matplotlib

M. Yoshinuma

List 14：色付きの散布図による表示

図１
４ List 14 の描画結果．

３．
２．
５ 最後に

す．公式のページ以外にも，インターネットでアクセスで

matplotlib の関数インターフェースを用いて，よく利用きる情報も豊富にありますので，検索してみると，解決策され る グ ラ フ を描 画 で き る よ う に 紹 介 し て き ま し た．

が見つかることでしょう．

matplotlib は，オブジェクトの集合として構成されている

さて，matplotlib を使ってみた感想はいかがでしょうか．

ため，関数インターフェースを使っていても，オブジェク

望みのグラフを得るためには，いちいち設定しないといけ

トを関数に渡したり，オブジェクトの機能を呼び出したりないと，面倒に感じたでしょうか．そのような場合にこそ，と，どうしてもオブジェクトを介した記述が出てきてしま

いろいろな設定の手間なく，最低限のデータさえ与えればいました．オ ブ ジ ェ ク ト に つ い ては，Python と そ のモ

望むようなプロットができる自分用の plot 関数を Python

ジュールを利用していくと自然とわかってくるかと思いまで書くときです．ぜひ，Python と matplotlib を活用してくす．また，matplotlib の公式ページには，多くのプロット例

ださい．

があり，それを描画したスクリプトを見ることができま

１６１

J. Plasma Fusion Res. Vol.94, No.3 (2018)１
６２‐１７０講座 今日からはじめる Python

３．Python による科学技術計算
3. Scientific Computing in Python

３．
３ Python を用いた多次元データ解析・機械学習
3.3 Multi−Dimensional Data Mining and Machine−Learning with Python
藤井恵介
FUJII Keisuke
京都大学 工学研究科（原稿受付：２
０
１
８年１月２
３日）

データ駆動科学が第４の科学的手法と言われ近年注目を集めています．なかでも Python は，データ科学の分野で最も人気を集めている言語です．Tensorflow やchainer，pytorchなど，最新の深層学習ライブラリは全てPython にて実装されています．ただしデータ科学に重要なのは，深層学習など先端的なアルゴリズムだけではありません．手持ちのデータを素早く可視化して内容を理解したり，既存のアルゴリズムに渡せるように複数データを合成したり，不良値や欠損値を埋めたりのような前処理の部分が意外と重要で手間がかかることが知られています．
ここでは，このようなデータ科学にフォーカスされたライブラリを紹介します．まず多次元データ処理ライ
ブラリとして，xarray の使い方を概観します．これらのライブラリはアルゴリズムというようりは，多様なデー
タを素早く扱うことができるインターフェースを提供するものです．次に，機械学習アルゴリズムが実装されているライブラリとして scikit-learn を紹介します．有名なアルゴリズムが数多く集められているライブラリで，様々なアルゴリズムを気軽に試すことが特徴です．最後に，高速な GPU 計算を簡単に実現することを目的として開発されている cupy というライブラリを簡単に紹介します．
なお，今回の記事で紹介する計測データには https://github.com/PlasmaLib/python̲tutorial/tree/master/
data からアクセスできます．ぜひダウンロードして，各自の PC で操作を体験してみてください．
Keywords:
Python, data science, libraries, machine learning, GPU computation

３．
３．
１ pandas と xarray

るだけでなく，ミスの元になります．

Python の有名なデータ解析ライブラリに pandas＊１があ

このようなデータ解析に必要な汎用的な操作をまとめてります．pandas は，汎用的なデータ解析に関するインター

インターフェースとして提供しているのが pandas です

フェースを提供するものです．その注目すべき特徴の１つ（日付関連の操作や，欠損値に対する操作，複数のデータをが，座標付きのデータ（labeled data）をうまく扱うことがまとめる操作など，他にも多様な便利機能がまとめられてできる点です．

います）．pandas はアンケート結果や株価の推移など，一例えば時系列データを扱うとき，時間データと計測値の般のデータ解析に広く用いられています．

２つを保持しておく必要が有ります．ある時間領域を切り一方でプラズマ計測データなど多くの物理データは，複出す時は同じ操作を両データに適用する必要が有ります

数の座標軸を持ちます．例えば，電子温度分布の時間変化

し，またある時刻での計測値を知りたいときは，時間デー

データは，計測位置と時間という２つの軸を持つことになタから対応する要素番号を探しだし，計測データに対してります．ある時間における分布が知りたかったり，ある位その要素番号を用いてアクセスすることが必要です．これ

置の温度の時間変化が知りたかったりします．しかし pan-らの操作は前節で紹介した np.ndarray でももちろん可das は１次元のデータ（表に表すことのできるデータ）し能ですが，毎回各自がコーディングしていると時間がかかか扱うことができません．xarray＊２＊３は，pandas を多次元

＊１ https://pandas.pydata.org/＊２ https://xarray.pydata.org/＊３ Hoyer, S. & Hamman, J., (2017). xarray: N-D labeled Arrays and Datasets in Python. Journal of Open Research Software. 5(1),p.10
Kyoto University, KYOTO 606-8501, Japanauthor’s e-mail: fujii@me.kyoto-u.ac.jp

１６２!2018 The Japan Society of Plasma
Science and Nuclear Fusion ResearchLecture Note

3.3 Multi-Dimensional Data Mining and Machine-Learning with Python

データに拡張したもので，地球科学研究分野から生まれたとするとよいでしょう．

ものです．まだ新しいライブラリですが，他種類の多次元

３．
３．
１．
２ xarray の使い方

データを扱うことの多いプラズマ研究でも有用だと思われ

K. Fujii

ここでは，実際のプラズマ実験データを使って xarray

ますので，ここで紹介します．

の使い方を説明します．核融合科学研究所の大型ヘリカル

３．
３．
１．
１ xarray のインストール

装置（LHD）で計測されたトムソン散乱による電子温度・

Anaconda distribution を用いて Python 開発環境を整え密度の結果を読み込みましょう．ファイルの読み込みプロ

た人はグラムやいくつかの計測データの例を https://github.com/PlasmaLib/python̲tutorial/tree/master/dataに用意しまconda install xarray

した．これを data フォルダに保存して以下のように読み込としてください．Native の Python を用いている人はみましょう．

pip install xarray

In_[1]:_import_xarray_as_xr__#_xarray_は_xr_と省略するのが一般的なようです
In_[2]:_import_sys
In_[3]:_sys.path.append(’data’)
In_[4]:_import_eg__#_読み込みプログラムも_data/eg.py_として保存しておいてください
In_[5]:_thomson_=_eg.load(’data/thomson@115500.dat’)__#_thomson_データの読み込み
In_[6]:_print(thomson)<xarray.Dataset>
Dimensions:______(R:_140,_Time:_246)
Coordinates:__*_Time_________(Time)_float64_0.0_33.0_66.0_100.0_133.0_166.0_200.0_233.0_...
__*_R____________(R)_float64_2.409e+03_2.436e+03_2.463e+03_2.49e+03_...
____ShotNo_______int64_115500
Data_variables:____Te___________(Time,_R)_float64_90.0_20.0_22.0_83.0_46.0_54.0_27.0_0.0_...
____dTe__________(Time,_R)_float64_1e+05_1e+05_1e+05_1e+05_1e+05_1e+05_1e+05_...
____n_e__________(Time,_R)_float64_0.0_0.0_0.0_0.0_0.0_0.0_1.0_30.0_0.0_3.0_...
____dn_e_________(Time,_R)_float64_2.0_2.0_2.0_2.0_2.0_2.0_2.0_243.0_1.0_...
____laser________(Time,_R)_float64_913.0_913.0_913.0_913.0_913.0_913.0_913.0_...
____lasernumber__(Time,_R)_float64_2.0_2.0_2.0_2.0_2.0_2.0_2.0_2.0_2.0_2.0_...
Attributes:____NAME:_____THOMSON____Date:_____11/19/201215:24

まず，print 文を用いた時の出力が綺麗に整形されていなどが得られますが，それらが Data variables セクショ

る こ と が わ か り ま す．Dimensions の 行 に(R: 140,ンに含まれています．Data variables セクションの例え

Time: 246)と あ る の は，含 ま れ る 変 数は，２つ の 次 元

ば Te の列には（Time, R）とありますが，これはこの変数

TimeとRに依存するということ，それらの大きさがそれぞ

が Time と R に依存するということを示しています．

れ１４０，２４６であることを示しています．Coordinates セ

xarray オ ブ ジ ェ ク ト の Coordinates や Data vari-クションには，それら軸の座標の値が表示されています．

ables には，辞書型のように[’Te’]というようにするこ

LHD のトムソン散乱では，電子温度や密度やその推定誤差とでアクセスできます．

In [7]: thomson[’Te’]
Out[7]:<xarray.DataArray ’Te’ (Time: 246, R: 140)>
array([[
90.,
20.,
22., ...,
0.,82., 1796.],
[
6.,
17.,
10., ...,
19.,
26.,
13.],
[
7.,
0.,
40., ...,
14.,
6.,
57.],
...,
[
6.,
133.,
0., ...,
43.,
40.,
23.],
[
10.,
9.,
48., ...,
70.,
53.,
58.],
[
7.,
39.,
14., ...,
26.,0.,15.]])
Coordinates:* Time(Time) float64 0.0 33.0 66.0 100.0 133.0 166.0 200.0 233.0 ...
* R(R) float64 2.409e+03 2.436e+03 2.463e+03 2.49e+03 2.517e+03 ...
ShotNoint64 115500
Attributes:

１６３

Journal of Plasma and Fusion Research Vol.94, No.3 March 2018

Unit:

eV

このように１種類のデータを選んでも，同時に座標情報がように，このデータには座標情報も付属します．.sel メ

付随していることがわかります．

ソッドを用いることで，座標軸を元に要素を選択すること

ラベルを用いたインデクシングができます．

Coordinates セクションに Time，R が表示されている
In [8]: thomson.sel(Time=6800.0, method=’nearest’)Out[8]:<xarray.Dataset>
Dimensions:(R: 140)
Coordinates:Timefloat64 6.8e+03* R(R) float64 2.409e+03 2.436e+03 2.463e+03 2.49e+03 ...
ShotNoint64 115500
Data variables:
Te(R) float64 6.0 13.0 7.0 18.0 9.0 34.0 5.0 15.0 799.0 167.0 ...
dTe(R) float64 9.0 5.0 1e+05 29.0 0.0 12.0 1.0 2.0 134.0 0.0 ...
n_e(R) float64 -4.0 -13.0 1.0 -9.0 -3.257e+04 19.0 49.0 91.0 ...
dn_e(R) float64 2.0 1.0 2.0 3.0 121.0 3.0 5.0 6.0 1.0 59.0 8.0 ...
laser(R) float64 912.0 912.0 912.0 912.0 912.0 912.0 912.0 912.0 ...
lasernumber (R) float64 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 ...
Attributes:
NAME:
THOMSONDate:
11/19/201215:24

ここでは，Time 軸が 6800.0 に最も近い計測値を取得しある時刻の結果だけグラフに描きたい，ということもよています．Dimensions の行から Time が消えて（R: 140）

くありますが，その場合も，.sel メソッドを用いることでだけになったことからもわかるように，全ての計測値を一１行で実現できます．

度にインデクシングしていることがわかります．
In [9]: plt.plot(thomson[’R’], thomson[’Te’].sel(Time=6800.0, method=’nearest’))Out[9]: [<matplotlib.lines.Line2D at 0x7f67c71b3470>]
In [10]: plt.xlabel(’$R$ (m)’)
Out[10]: <matplotlib.text.Text at 0x7f67cdedd6d8>
In [11]: plt.ylabel(’$T_mathrme$ (eV)’)Out[11]: <matplotlib.text.Text at 0x7f67cdee6780>

座標名を利用した操作

例えば，プラズマ中心での電子温度の時間変化が知りた

xarray オブジェクトは，軸に名前をつけて保持している

いとしましょう．ただし，ある一点の計測値のみを用いる

ので，データが格納されている配列の軸の順序（１つ目のとノイズが大きくなるので，ある程度の範囲内でデータを軸が Time，２つ目の軸が R に対応している，など）を覚え平均するのがよいでしょう．今回は，プラズマ中心付近のておく必要がありません．

3500〜3800 mm で の 温 度 を 平 均 す る こ と に し ま す．ま１６４

Lecture Note

3.3 Multi-Dimensional Data Mining and Machine-Learning with Python

ず，データに付属する軸情報から，この範囲内に収まる

K. Fujii

用いることができます．

データのみを切り出します．上記と同様に sel メソッドを# R = 3500.0 - 3800.0 間のデータを選択
In [12]: thomson_center = thomson.sel(R=slice(3500.0, 3800.0))

In [13]: thomson_center
Out[13]:<xarray.Dataset>
Dimensions:(R: 17, Time: 246)
Coordinates:* Time(Time) float64 0.0 33.0 66.0 100.0 133.0 166.0 200.0 233.0 ...
* R(R) float64 3.502e+03 3.521e+03 3.54e+03 3.559e+03 ...
ShotNoint64 115500
Data variables:
Te(Time, R) float64 2.099e+03 8.383e+03 1.446e+04 5.0 ...
dTe(Time, R) float64 1e+05 1e+05 2.882e+04 1e+05 1e+05 1e+05 ...
n_e(Time, R) float64 0.0 0.0 3.0 11.0 0.0 0.0 0.0 3.0 0.0 0.0 ...
dn_e(Time, R) float64 0.0 1.0 8.0 51.0 0.0 0.0 1.0 26.0 1.0 1.0 ...
laser(Time, R) float64 913.0 913.0 913.0 913.0 913.0 913.0 913.0 ...
lasernumber (Time, R) float64 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 ...
Attributes:
NAME:
THOMSONDate:
11/19/201215:24

このデータを大半径方向に平均することにしましょう．

２つの軸（R, Time）のうち，どちらの方向に平均をとるか

平均操作には mean メ ソ ッ ド を 用 い ま す．引 数 として，を指定します．

In [14]: thomson_center.mean(dim=’R’) # ’R’ 方向の平均
Out[14]:<xarray.Dataset>
Dimensions:(Time: 246)
Coordinates:* Time(Time) float64 0.0 33.0 66.0 100.0 133.0 166.0 200.0 233.0 ...
Data variables:
Te(Time) float64 3.493e+03 4.575e+03 8.478e+03 834.7 ...
dTe(Time) float64 8.549e+04 1.951e+04 9.317e+03 7.085e+03 ...
n_e(Time) float64 1.0 1.474e+03 861.5 1.352e+03 668.2 373.5 ...
dn_e(Time) float64 5.647 12.18 12.12 16.76 10.59 9.647 9.118 ...
laser(Time) float64 913.0 914.0 910.0 912.0 909.0 912.0 912.0 ...
lasernumber (Time) float64 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 ...
In [15]: plt.plot(thomson_center[’Time’], thomson_center[’Te’].median(dim=’R’))
Out[15]: [<matplotlib.lines.Line2D at 0x7f67c7d77f98>]
In [16]: plt.xlabel(’time (s)’)
Out[16]: <matplotlib.text.Text at 0x7f67c71f3fd0>
In [17]: plt.ylabel(’$T_mathrme$ (eV)’)Out[17]: <matplotlib.text.Text at 0x7f67c723e6a0>

１６５

Journal of Plasma and Fusion Research Vol.94, No.3 March 2018

座標を用いた異種データの結合

う際はこのような操作が必須です．pandas や xarray には異なる時間間隔で計測されたデータ間を結合したい時も簡便な方法が用意されています．

あると思います．例えば，トムソン散乱と干渉計による電

ここではまず，干渉計のデータを読み込みましょう．同子密度の計測結果を比べることを考えます．ただし，トム様に，data ディレクトリ内にデータを用意しておいてく

ソン散乱と干渉計では計測タイミングが異なるので直接はださい．

比較できません．この場合に限らず，複数種のデータを扱
In [18]: fir = eg.load(’data/firc@115500.dat’)# 干渉計データの読み込み

In [19]: fir
Out[19]:<xarray.Dataset>
Dimensions:(Time: 1311)
Coordinates:* Time(Time) float64 0.1 0.11 0.12 0.13 0.14 0.15 0.16 0.17 0.18 ...
ShotNoint64 115500
Data variables:nL(3669) (Time) float64 0.0001822 0.0001822 0.0001822 0.0001822 ...
nL(3759) (Time) float64 -0.003244 -0.003244 -0.003244 0.005867 ...
Attributes:
NAME:
firc
Date:
11/19/201222:20

干渉計の計測時刻は（0.1, 0.11, ...）となっており，トムソのためには reindex メソッドを利用できます．引数に，比ン散乱の計測時刻（0.3, 0.33, ...）と異なることがわかりま較したい軸（今回は Time）とその比較対象，およびその方す．ここでは，トムソン散乱の計測時刻に最も近い計測時法を指定します．今回は最近傍のもの（nearest）を取得

刻での干渉計のデータを集めてくることにしましょう．そします．

# thomson の時刻が [ms]なので [s] に修正する.
In [20]: thomson[’Time’] = thomson[’Time’] * 0.001# thomson の時刻に最も近い fir 計測結果を取得する.
In [21]: fir_selected = fir.reindex(Time=thomson[’Time’], method=’nearest’)
In [22]: fir_selected
Out[22]:<xarray.Dataset>
Dimensions:(Time: 246)
Coordinates:* Time(Time) float64 0.0 0.033 0.066 0.1 0.133 0.166 0.2 0.233 0.266 ...
ShotNoint64 115500
Data variables:nL(3669) (Time) float64 0.0001822 0.0001822 0.0001822 0.0001822 ...
nL(3759) (Time) float64 -0.003244 -0.003244 -0.003244 -0.003244 ...
Attributes:

１６６

Lecture Note

NAME:
Date:

3.3 Multi-Dimensional Data Mining and Machine-Learning with Python

K. Fujii

firc11/19/201222:20

これで両者の演算が可能になりました．

た人はその他の特徴conda install scikit-learn

xarray は他にも様々な便利機能を備えています．
・軸・データの関係を記録する netCDF＊４ファイルへのとしてください．Native の Python を用いている人は入出力

pip install scikit-learn

・dask＊５を用いたメモリに格納できない規模のデータの取り扱い，並列計算とするとよいでしょう．
３．
３．
２．
２ scikit-learn の使用例

ここではこれらを説明する紙面の余裕がありませんが，どれも広い分野のデータ解析に有用な機能となっていま

scikit-learn では様々な手法が利用できますが，ここではす．xarray の document ペ ー ジ http://xarray.pydata.org

線形回帰を紹介します．線形回帰とは，計測データ y を基をご参考ください

底関数 %
"%
$&
&の線形和で近似するものです．

こういったライブラリが提供するツールは，コーディン$%!$$ #"""%!&

グさえすれば NumPy だけでも実現できます．そのため，"時間をかけてライブラリの使用法を習得しようというインセンティブが湧かないかもしれません．しかし毎回自身でここで，%$&にどういった式#"&は線形結合の係数です．"%

コーディングすることは，試行錯誤のスピードを低下させを用いるかで，多項式近似や，スプライン近似などを表すことができる汎用的なモデルです．scikit-learn では lin-

るだけでなく，ケアレスミスも誘発します．
最初に使用法を覚える段階はまどろっこしく自身で作っear_model モジュールとして提供されています．ここでた方が早いように感じますが，慣れてしまうとこのようなは，前節で紹介したトムソン散乱による電子温度分布を複ライブラリを用いる方が圧倒的に操作が楽に確実になりま

数のガウス関数の和で近似することにします．
最も簡単な近似法は，最小二乗法です．最小二乗法では，す．有用なツールの習得に時間をかけるのは，ちょっとした投資と言えるかもしれません．

"

$ !%
$
"
!!$ #""
"%
!&
!

３．
３．
２ 機械学習ライブラリ scikit-learn"を最小化する #"を求めます．

Scikit-learn は Python で最も有名な機械学習ライブラリでしょう．主な特徴は以下のようなものです．

最小二乗法は，ノイズがガウス分布に従っていると仮定

・一般的な機械学習アルゴリズムが網羅されているしたものです．しかし，一般にノイズが綺麗なガウス分布

・ドキュメントがよく整備されており，素人でも簡単にに従っているとは限りません．例えば前節に示したトムソ

利用できる

ン散乱による電子温度分布にも，外れ値と言えるような・簡単に理解できる平易な実装となっている

データ点も見受けられます．

・計算負荷の高いところは C++で実装されているため

このような外れ値を含むようなデータの近似アルゴリズ

比較的高速

ムも様々に存在します．scikit-learn でも複数種類実装され機械学習というと，IT 関係，人工知能関係のごく限られていますが，ここでは Huber 回帰という手法を用いたもの

た内容を想定されるかもしれませんが，そんなことはありを紹介します．

ません．機械学習とは統計と言い換えてもほとんど問題な

Huber 回帰では，通常の最小二乗法と異なり，以下のコいでしょう．実験データや計算データなど，データ解析にスト関数を最小化します．

関わる問題であれば関わる可能性も高いと思います．

$%!!# #""
"%
!&
"
$ !!
"
#
!

主に
・回帰問題
・教師有り分類問題

ここで，#は外れ値を除いたノイズの分散で，これも・教師無し分類問題

データから推定します．! %&&は Huber のロス関数で，以・次元圧縮・特徴抽出

下のように定義されるものです．
! "
&
'
'
#!
&
&
&
"$
!%
"
&
&
!!
"'
'
!! '
'
$
#

・モデル選択・データ前処理に関する様々なアルゴリズムが実装されています．
３．
３．
２．
１ scikit-learn のインストール

簡単には，近似値の近くにある点については通常の二乗

Anaconda distribution を用いて Python 開発環境を整え誤差を考え，#より遠く離れている点については一乗誤差＊４ https://www.unidata.ucar.edu/software/netcdf/＊５ https://dask.pydata.org/en/latest/

１６７

Journal of Plasma and Fusion Research Vol.94, No.3 March 2018に緩和してロス関数に加えるものです．遠く離れている点

ここでは，scikit-learn を用いて Huber 回帰を行ってみまについてのコストが小さくなるため，外れ値に引っ張られす．

ることが少なくなります．
In [1]: from sklearn import linear_model# linear_model モジュールを用います# data ここでは6800 msに得られたTeの分布を解析しますIn [2]: Te = thomson.sel(Time=6800, method=’nearest’)[’Te’].values
In [3]: R = thomson[’R’].values# basis R:2500--5000 を１０分割した点を中心とするガウス関数の和で近似しましょう
In [4]: centers = np.linspace(2500, 5000, 10)
In [5]: phi = np.exp(-((R.reshape(-1, 1) - centers) / 200)**2)# 最小二乗法
In [6]: lin = linear_model.LinearRegression(fit_intercept=False)# フィッティング
In [7]: lin.fit(phi, Te)Out[7]: LinearRegression(copy_X=True, fit_intercept=False, n_jobs=1, normalize=False)# 求めたフィッティング係数を用いた予測
In [8]: Te_lin_fit = lin.predict(phi)# ロバスト最小二乗法
In [9]: rob = linear_model.HuberRegressor(fit_intercept=False)# フィッティング
In [10]: rob.fit(phi, Te)Out[10]:
HuberRegressor(alpha=0.0001, epsilon=1.35, fit_intercept=False, max_iter=100,
tol=1e-05, warm_start=False)# 求めたフィッティング係数を用いた予測
In [11]: Te_rob_fit = rob.predict(phi)In [12]: plt.plot(R, Te, ’--o’, ms=3, label=’data’)Out[12]: [<matplotlib.lines.Line2D at 0x7f67c3607940>]
In [13]: plt.plot(R, Te_lin_fit, label=’linear regression’, lw=2)
Out[13]: [<matplotlib.lines.Line2D at 0x7f67c7db60b8>]
In [14]: plt.plot(R, Te_rob_fit, label=’huber regression’, lw=2)
Out[14]: [<matplotlib.lines.Line2D at 0x7f67c358d9e8>]
In [15]: plt.legend(loc=’best’) # 凡例を表示する
Out[15]: <matplotlib.legend.Legend at 0x7f67c7db6198>
In [16]: plt.xlabel(’$R$ (mm)’)Out[16]: <matplotlib.text.Text at 0x7f67c4a4a400>
In [17]: plt.ylabel(’$T_mathrme$ (eV)’)Out[17]: <matplotlib.text.Text at 0x7f67c35ca518>

１６８

Lecture Note

3.3 Multi-Dimensional Data Mining and Machine-Learning with Python

通常の最小二乗法では，異常値に引きずられて !!2500

K. Fujiiています．

mm 付近で多くの計測点から離れているのに対し，Huber

GPU 計算には，例えば NVIDIA が提供するライブラリの回帰ではこれら異常値に頑健なフィッティングができてい

CUDA［１］を呼び出して実行する必要があります．しかしることがわかります．

そのインターフェースは非常に低レベルで，なかなか素人

ま た 実 装 面 で は，LinearRegression と HuberRe-

が気軽に使えるものではありません．さらに，もしそのイ

gressor は引数・戻り値などの使い方が統一されていま

ンターフェースに習熟したとしても，低レベルなインター

す．そのため，LinearRegression では外れ値に影響さフェースからバグのないアルゴリズムを組み立てることはれすぎていると感じれば，すぐに HuberRegressor など

非常に骨の折れるものとなります．

のロバストな回帰手法を試すことができるようになっていCupy を用いることで，すごく気軽に GPU 計算を行うこます．他にも様々 な ア ル ゴ リ ズ ム が よ く 似 た イ ン ターとが可能になります．Python から GPU 計算を行うライブ

フェースで提供されており，簡単に試行錯誤を重ねること

ラリは複数ありますが，Cupy の特徴はなんといっても，ができる，ということがこのようなライブラリを用いるこ

NumPy と（ほとんど）同じ API を提供する点です．そのたとのメリットだと思います．

め，使い方の習得が容易で，デバッグも非常に簡単です．

この節では，回帰問題を通して scikit-learn の使い方を簡

NumPy で開発したプログラムを GPU 用に移植することも単に紹介しました．上記の回帰問題からもわかるように，簡単でしょう．

全てのデータに無条件で合うモデルは存在しません．よい

３．
３．
３．
２ Cupy のインストール

モデルはデータに依存するため，色々なモデルを適用してCupy をインストールするには，NVIDIA 製 GPU とそのみて結果を見るというような多数回の試行錯誤が必要で

ドライバ，さらに CUDA ライブラリをインストールしておす．scikit-learn では，そのような試行錯誤を簡単にできる

く必要があり ま す．これらのインストールについてはよう工夫されて作られています．たくさんの例がドキュメ

https://docs-cupy.chainer.org/en/stable/install.html を 参

ントページにまとめられているので，ぜひそちらもご覧く

照してください．

ださい．

上記作業の後に，
pip install cupy

３．
３．
３ Python での高速計算〜NumPy互換GPU計算ライブラリCupy〜とすることで Cupy をインストールすることができます．
３．
３．
３．
３ Cupy の使い方

Cupy は，簡単に GPU 計算を実装するためのライブラリです．これまで紹介した数値計算ライブラリ NumPy と同上で述べたように，Cupy は NumPy と同じ API で設計さじ API を提供しているため，NumPy でプログラムを作っれているので，使い方もほとんど NumPy のものと同じでておいて，きちんと動くことを確認してから Cupy に変更

す．以下は，ランダムに生成した行列の行列積を求めるプ

する，といった使い方が可能です．なんと言ってもデバッ

ログラム例です．

グが簡単で，非常に気軽に GPU 計算を試すことができま

import numpy as np

す．ここでは Cupy の使い方を簡単にご紹介します．

A_cpu = np.random.randn(10000, 20000)

３．
３．
３．
１ Cupy の特徴

B_cpu = np.random.randn(20000, 30000)

Cupy は日本のベンチャー企業 Preferred Networks が主# numpy を使ってCPU で行列積を計算する

導して開発しているオープンソースライブラリです．同企

AB_cpu = np.dot(A_cpu, B_cpu)

業が開発している深層学習ライブラリ Chainer で用いられ
１６９

Journal of Plasma and Fusion Research Vol.94, No.3 March 2018

小限に留める必要があります．

この計算を，Cupy を用いて GPU 上で行うには，以下のよとは言え，このような GPU 計算の長所・短所も，色々なうにします．
import cupy as cp

プログラムを実装しながら学んでいけるというのがこう# cupyはcpと略すのが一般的なようです

いったライブラリを使うメリットだと思います．

# np.ndarrayからGPU上のメモリにデータを移動する

３．
３．
４ まとめ

A_gpu = cp.ndarray(A_cpu)

この章では，データ科学に有用なライブラリを紹介しま

B_gpu = cp.ndarray(B_cpu)

した．xarray で行うことのできる操作は非常に基本的で日# cupyを使ってGPUで行列積を計算する

常的に行うものです．そのためこのような操作は自身でもAB_gpu = cp.dot(A_gpu, B_gpu)できると感じる方も多いでしょう．また，scikit-learn を用# メインメモリ上にデータを移動する
AB_cpu2 = AB_gpu.get()

いた機械学習や

Cupy で行う GPU 計算は，そのコアの部分が隠蔽されたインターフェースになっているのでもどか# AB_cpu2 は np.ndarray 型

しく，自身で作らないと安心できないと感じるかもしれま
せん．

A̲gpuはcp.ndarray型のオブジェクトであり，実体はGPU メモリ上に生成されています．cp.dot 関数で，GPU

しかし，毎回低レベルな部分からプログラムを開発する

メモリ上に確保された配列の行列積を GPU を用いて計算には非常に労力がかかります．デバッグ作業も骨の折れるします．この関数の戻り値も cp.ndarray 型のオブジェク

作業でしょう．これらのライブラリの特徴は，すぐに使えトであり，実体は同様に GPU メモリ上にあります．get

ることにあります．ファインチューニングを施した高速なメソッドを実行することで，この配列をCPUメモリ上に移

アルゴリズムを開発するよりも，得られたデータに対してすことができます．この戻り値は np.ndarray 型となりま様々なアルゴリズムを気軽に試して，よりたくさんの試行

す．

錯誤を行うことが，データ解析を進める上でも効果的だと思います．

その他にも，要素積や FFT，特異値分解など，NumPyの多くの操作が実装されています．詳しくは，公式ページ

なお，これらのオープンソースライブラリは，複数人でテストを重ねながら開発が進められことが一般的です．そ［２］をご覧ください．
ここでは，非常にお手軽にGPU計算を行えるライブラリのため，個人でプログラムを開発するよりもバグが少ないとして Cupy を紹介しました．もちろん，GPU を使って高ことが期待されます．ソースコードも公開されていますの速化するには GPU 計算についての知識が必要です．例えで，内容を確認したいという方はぜひソースコードを読んば，GPU は行列計算のような並列処理は得意で CPU より

でみてください．

数１０倍速く計算できることもしばしばですが，条件分岐が参考文献

重なるなど並列化が難しい処理の速度は非常に遅くなります．また，メインメモリ・GPU メモリ間のデータの移動が［１］https://developer.nvidia.com/cuda-downloads

ボトルネックとなることが多いため，そういった操作は最［２］https://cupy.chainer.org/!!!!!!!!!!!!!!!!

ふじ

い

けい

すけ

藤 井 恵 介京都大学工学研究科専門は光計測，機械学
習．２
０１
２年３月京都大学工学研究科博士後期課程修了．豊富に蓄積されているプラズ
マ実験データの有効利用をめざして，統計的手法・機械学習の導入に奮闘しています．趣味ではオープ
ンソースソフトウェアの開発にも参加しています（https://github.com/fujiisoup）．プラズマ・核融合分野でもオープン
ソース・ソフトウェアの文化が広まればいいですね．

!!!!!!!!!!!!!!!!

!!!!!!!!!!!!!!!!!!!!!!!!!!

!!!!!!!!!!!!!!!!!!!!!!!!!!

１７０

J. Plasma Fusion Res. Vol.94, No.4 (2018)２
１２‐２１５

講座 今日からはじめる Python

4．Python の活用
4. Application of Python

４．
１ LHD 実験における Python の活用
4.1 Application of Python in LHD Experiment
江本雅彦
EMOTO Masahiko
核融合科学研究所（原稿受付：２
０
１
８年２月２
６日）

myView2 は LHD の実験データを閲覧するため，主として共同研究者向けに開発されたアプリケーションであり，共同研究者が利用しやすいよう，無料配布可能で，様々な OS で実行可能にするため，Python を用いて開発されました．この章では，myView2 の概要を紹介するとともに，多様な環境で動かすアプリケーションを作成する際の注意点を解説します．
Keywords:
myView2, LHD

共同研究施設である核融合科学研究所で行われる大型ヘを自由に変えられる必要もあります．

リカル実験には，多くの国内および海外の大学・研究所の研究者や学生が参加しています．彼らの多くは，短期滞在

以上のような条件を満たすため，オープンソースのプロ

中に実験を行ってデータの解析等をするため，実験で収集

グラミング言語である Python を用いた，可視化ツール my-

されたデータは，携帯したノートパソコンで直ぐにでも取View2 を開発しました（図１）．

得・閲覧できる必要があります．この様な目的の為に共同

myView2 は，ほぼ全て（＊）を Python2.7 で記述してお研究者に配布可能なデータの可視化ソフトの条件として

り，Windows，MacOS，Linux 上で動作可能です．このソは，以下のようなものが挙げられます．

フトは，大きく分けると，本体部分と，実験データの読み込みを行うデータローダの２つから構成されています．

１．Windows を始めとする，多くの OS 上で動作すること

データローダはデータ取得に必要なインタフェイスを実装

研究者が携帯するノートパソコンの OS は，Windows

した Python のモジュールであり，百以上の LHD 実験デー

だけでなく，MacOS もあり，また，多くの研究者が利用すタに特化したデータモジュールが提供されています

るという点では，Linux での利用もあり，これらの OS 上で（図２，３）．ただし，myView2 自体は汎用の可視化ツール

動作する必要があります．

として使うことを目的に作られたものであり，それぞれの２．実行環境が無料で配布できること

データフォーマットに対応したデータローダを用意するこ

データの可視化を行うためのソフトウェアとしては，とで，本体側のソフトウェアを変更することなく，大型ヘ

IDL や MATLAB 等が広く使用されていますが，これらはリカル装置（LHD）実験以外の様々な実験データを可視化

商用のソフトウェアです．この様なソフトウェアを使用すすることができます．

ることは，利用者に負担がかかるため，オープンソース，

グラフは，画面上の任意の矩形領域に複数のデータを表

または，無料で配布できる必要があります．

示することができ，通常の X-Y グラフの他にヒートマップ

３．カスタマイズが容易であること表示を行うことができます（図１参照）．

可視化するデータは，既存のものだけでなく，共同研究使用するデータローダや，グラフの配置等は，設定ファ者が新たに設置した機器によって取得されたデータも扱え

イルとして保存することができ，る必要があります．また，関心ある内容に応じて表示形式

計測毎に必要な情報を把握しやすいようにあらかじめレイ（＊）一部，LHD の解析データを取得するためのコマンドが，バイナリで配布されています．
National Institute for Fusion Science, Toki, GIFU 409-5292, Japanauthor’s e-mail:emo@nifs.ac.jp

２１２!2018 The Japan Society of Plasma
Science and Nuclear Fusion ResearchLecture Note

4.1 Application of Python in LHD Experiment

図１

M. Emoto

myView2 実行画面（Windows 10 で実行）．

アウトしたものを提供することが可能です．このような設class InterFace(mask.Mask):# コンストラクタ
def __init__(self, dataid, **kwargs):# データの取得
def load(self, **kwargs):# x 軸の配列データを取得
def varsx(self, **kwargs):# y 軸の配列データを取得
def varsy(self, **kwargs):# データの次取得
def dataset(self, **kwargs):
図２

定ファイルはネットワーク共有フォルダ上で提供されており，これらのファイルを使うことにより，所外の共同研究者が必要なデータを可視化したい場合でもすぐに参照できます．表示するデータは，データサーバから直接取得する
他，ハードディスク上にキャッシュされたものを表示することができます．データの取得先をキャッシュに切り替えることで，データサーバに接続されていない状態でもデータを可視化でき，共同研究者が自身の研究所に戻ってからもデータの解析を継続することが可能です．また，データ
ベースサーバに接続可能な場合は，キャッシュされたデー

データーローダクラス．

図３

クラス図

タと比較を行い，データが更新されていれば，データベー

各データローダーはデータローダーインタフェイスを実装．

２１３

Journal of Plasma and Fusion Research Vol.94, No.4 April 2018

スサーバから再取得を行います．

ため，よく使われるパッケージが予め用意され，簡単に必

また，LHD 実験に特化した機能として，実験シーケンス

要なパッケージのインストールができる，Python の開発に応じて自動的にデータの更新を行うことができます．こ環境を使用することが勧められています．この種の開発環の機能を利用して，実験中は制御室の中央に用意した１０数

境 と し て は，Anaconda

台の PC で直近のデータを表示させ，実験責任者が実験の

myView2 は双方の環境での動作チェックを行っています．

状況を把握するのに貢献しています．

ただしAnacondaはPythonの一貫した環境を提供するもの

や Enthought Canopy が あ り，

myView2 の開発言語である Python は，核融合プラズマであり，OS の標準ライブラリを置き換えることは行いまを含む広い科学技術分野で利用されており，３章で紹介しせん．このため，CentOS6 では先に述べたような wxPy-

たように，科学技 術 計 算 を 行 う た め ラ イ ブ ラ リ である

thon の問題が発生し，myView2 を動作させることができ

SciPy や機械学習のためのライブラリである scikit-learn

ません．一方，Canopy はこれらのライブラリも提供するの等，便利なライブラリが多数公開されています．myView

で，動作可能です．このことから，myView2 の実行環境と2 では，matplotlib および，wxPython 等を利用しています．

して Enthought Canopy が推奨されています．

matplotlib は２次元のみならず，３次元のプロットが行え

myViw2 自体は，すべて Python で記述されていますが，ます．wxPython は Python で記述された，プラットフォー

OS によって振る舞いが違う部分があるため，一部 OS 毎にムに依 存 し な い GUI（グ ラ フ ィ カ ル・ユ ー ザ イ ン タ ー

処理を分けている箇所があります．一つは，LHD の実験

フェース）を提供するライブラリであり，wxPython を利

データを取得する部分です．この部分は Python で全てを用することで，様々な OS 上で動作する GUI アプリケー

記述するのが困難であるため，あらかじめ各 OS 用に用意

ションを作ることができます．

したデータ取得用のバイナリコマンドを呼び出していま

これらのライブラリは，実行速度を得るために，Python

す．この際，OS 毎にバイナリの保存場所や呼び出しの際のだけでなく，C 言語等で書かれた外部ライブラリを必要と環境変数設定が異なるため，OS 毎に依存した処理を行っしています．一般的には，これらのライブラリはソースています．

コードで配布され，各ユーザがコンパイルしてインストー

また，myView2 では，上記の様に LHD 実験に対応する

ルするという作業が必要です．標準的なコンパイラが用意ため，実験シーケンスに応じて，自動的にグラフを更新す

さ れ て い る Linux や MacOS 等 で は，pip と い う Python

る機能がありますが，これは，マルチスレッドで実現してのパッケージ管理コマンドを使うことで，必要なファイル

います．ところが，Linux でグラフィックの書き換えを複を取得し，自動的にコンパイルおよびインストールが行わ

数のスレッドで同時に行うと，クラッシュしてしまいま

れます．一方，Windows ではバイナリによる配布が基本です．そこで，画面の描画を一つのスレッドによって行わせすので，Windows でこれらのライブラリを個別にインスるために，callAfter というメソッドを呼 び 出 し て い ま

トールする際には注意が必要です．

す．一方，このような問題は MacOS や Windows では生じ

Python 自体はオープンソースで公開されているため，ず，逆に MacOS では画面の書き換えが失敗してしまうた

Windows 用の Python は無料・有料を含め複数のディスト

め，図４のように，OS 毎に関数の定義を変えることによっリビュータが存在しています．これらの処理系に Pythonて，この問題に対処しています．

の拡張ライブラリを追加する際には，コンパイラの種類や最近，韓国 NFRI（National Fusion Research Institute）の依存しているバージョン等に矛盾が無いようにしなければ

KSTAR システムで myView2 を利用できるように作業をなりません．OS 標準（もしくはそれ に 準 ずる）Python

行いましたが，汎用的に作成したはずの myView2 のソーと，C コンパイラが提供される MacOS や Linux では，標準スコード中に核融合科学研究所内のサーバ名等が陽に書か的な環境でコンパイルすることで，一貫性のあるパッケー
ジを用意することができますが，Windowsではそれが困難

def CallNow(callableObj, *args, **kw):
callableObj(*args, **kw)になります．
また，OS が提供するライブラリのバージョンにも注意が必要です．myView2 は GUI に wxPython 2 以降を使用し

if platform.system() == ’Linux’:
CallAfter = wx.CallAfter
else:
CallAfter = CallNow…
…

ています．wxPython は個々の OS が提供するGUIライブラ
リの違いを吸収するように実装され，どの OS でも同じイ
ンタフェイスを提供しています．Linux の場合，wxPython
は下位の GUI ライブラ リ と し て GTK を 利 用 し ますが，CentOS6 で提供している GTK のバージョンは 1.2 であり，
myView2 が必要としている wxPython の新しいバージョ

def UpdateGraph(self):#更新されたデータを描画する…
….
CallAfter(self.canvaspanel.update_real)

ンをインストールすることができません．CentOS 等，多くの Linux ディストリビューションでは，ライブラリやア
プリケーションのバージョンは複雑に依存しているので，単純にライブラリを置き換えることは容易ではありません．

図４

このようなパッケージ管理にまつわる煩わしさを避ける
２１４

OS によって描画処理を変える．

Lecture Note

4.1 Application of Python in LHD Experiment

M. Emoto

れている部分が多く見つかりました．LHD および KSTAR

グラムを多くの人に使用してもらうためには，自分以外の用に別々にソースコードを持つことは，管理が複雑になる

多様な環境に対応するよう心掛けてほしいと思います．まため，これらの依存部分はソースコードから分離し，設定

た，Python 自体は様々な環境で動作するプログラミング

ファイルから読み出すようにしました．設定ファイルは，言語ですが，便利だからといって，インターネット上に公空白を含むファイル名や構造を持ったデータを容易に扱開されている様々な Python のパッケージを使用するプロ

え，かつ，視認性が良いことから，JSON 形式のファイルをグラムを作ってしまうと，特定の環境下だけでしか動かな採用しました（図５）．

くなったり，依存するパッケージのサポート終了によっ

自分の研究のために，Python を使った解析プログラムて，保守ができなくなったりすることがあるので，注意がやツールを開発することは多いでしょうが，開発したプロ

必要です．

{
”cachefilename”: ”cache.txt”,”cachefoldername”: ”cache”,”commandfoldername”: ”bin”,”config_version”: ”1.1.1”,”datamodulefilename”: ”datamodules.txt”,”datamodulefoldername”: ”DataModules”,”docpage”: ”http://kaiseki-web.lhd.nifs.ac.jp/software/myView2/myView2-Eng.pdf”,”enabledmodulefilename”: ”enabled.txt”,
…
…
}
図５

設定ファイルの例．

２１５

J. Plasma Fusion Res. Vol.94, No.4 (2018)２
１６‐２１９講座 今日からはじめる Python

4．Python の活用
4. Application of Python

４．
２ JT-60SA 実験における Python の利用
4.2 Application of Python in JT-60SA Experiment
浦野

創

URANO Hajime
量子科学技術研究開発機構那珂核融合研究所（原稿受付：２
０
１
８年２月２
６日）

JT-60SA では Python を利用した汎用データ解析ソフトウェア（eDAS）の開発を行っています．eDAS は
JT-60SA 実験に関連する複数の異なる種類の大容量データを扱う他，将来的な機器や装置の改良に備え，プラグ
イン形式での柔軟な拡張性を有する設計の下で開発されています．研究所内外のユーザが利用するような汎用ソ
フトウェアの場合は，イベント管理を widget で構成された GUI として実装し，特にデータアクセスやグラフ描画
をインタラクティブな操作で行えるように開発することが重要となります．
Keywords:
experiment analysis software, database, plugin, wrapper, graph, GUI, Python, JT-60SA

４．
２．
１ eDAS の概要

JT-60SA の解析サーバ内における汎用データ解析ソフト

大型実験装置でのデータ解析ソフトウェアは，単に大容

ウェア周りのデータフローを示します．JT-60SA ではデー量データを扱うというだけでなく，複数の異なる種類のタの種類に応じた複数のデータベース（DB）を配置しておデータを扱いながらデータ解析を行う必要があるため，そり，eDAS の各ツールは解析の目的に応じて DB との入出の目的に準じたユーザインターフェースと可視化機能，そ力を行います．DB アクセスについては，C 言語や Fortran

して解析されたデータの出力機能が要求されます．量子科

で記述された関数群をライブラリ化しており，Python で学技術研究開発機構が幅広いアプローチ（BA）協定の下でwrapper 処理したオブジェクトをユーザに提供しています．

欧州と共同で設計・製作を進めている大型トカマク装置

上記の各 DB とのデータの入出力を行うためのオブジェ

JT-60SA［１］で は，そ の 汎 用 デ ー タ 解 析 ソ フ ト ウ ェ ア

ク ト の 他，一 部 の グ ラ フ 描 画 用 の オ ブ ジ ェ ク ト な ど，

（eDAS）を Python で開発しています．
解析対象となるデータには，実験室レベルと大型装置において冒頭で述べたような違いはある一方で，データベー
スやメモリ容量など，要求される解析に足るハードウェア
側の受け皿が整備されていれば，Python を用いたデータ
解析ツールとしてはソフトウェアの機能に大きな違いは生じません．しかし，その一方で解析ソフトウェアとして複数の異なる種類の大容量データを扱うということは，デー
タ解析の目的は多様にわたることは容易に想像できます．
従って，大型装置における汎用データ解析ソフトウェア
は，十分な機能の拡張性を有する設計の下で開発される必要があります．
eDAS は，JT-60SA における汎用データ解析ソフトウェアの総称であり，放電波形描画ツール（eGIS），プラズマ平
図１

衡解 析 ツ ー ル（eSURF），プ ラ ズ マ 空 間 分布 解 析 ツ ー ル（eSLICE）の３つ の ツ ー ル か ら 成 っ て い ま す．図１にJT‐
６
０SA の解析サーバ内における汎用データ解析ソフト
ウェア周りのデータフロー．

National Institutes for Quantum and Radiological Science and Technology, Naka, IBARAKI 311-0196, Japanauthors’s e-mail: urano.hajime@qst.go.jp

２１６!2018 The Japan Society of Plasma
Science and Nuclear Fusion ResearchLecture Note

4.2 Application of Python in JT-60SA Experiment

H. Urano# Widget の配置
self. layout ( ) . addWidget ( self. this _btn)# ボタンをクリック時のイベントをボタンへ接続する
self. this _ btn. clicked. connect ( self.
clicked_btn_action)# ボタンをクリックした際の動作を設定
def clicked_btn_action(self):
print(”Hello World !”)図２

if __name__ == ”__main__”:import sys

eDAS のソフトウェア構成．プラグインによる機能の拡張性を踏まえた設計となっている．

# アプリケーションの作成
app = QtGui.QApplication(sys.argv)

eDAS 内の各ツールにはいくつかの共通のクラスが存在し# simpleBtnWidget クラスのインスタンスを作成
btn_widget = simpleBtnWidget()ます．そのため，eDAS は図２に示すようにソフトウェア
全体に共通なオブジェクトで構成される主幹部と各ツール# widget の表示
btn_widget.show()の主幹部が組み合わさって機能する設計になっています．

# 実行
sys.exit(app.exec_())

これはソフトウェアの構成としては，Microsoft Office の中の Word や Excel 等の位置づけに似ています．DB アクセス用のオブジェクトはプラグイン形式で開発されているた
め，DBの仕様変更があった場合には，このオブジェクトを

これはボタンの widget（GUI を構成する部品要素）をウ

アップデートするだけで全てのツールが利用できます．プ

インドウ上に配置し，ボタンを押すと，"Hello World!"を出ラグイン形式の最大の利点はソフトウェアの拡張性であ力するプログラムです．PySide のイベントの管理は，GUIり，将来的な機能拡張に加え，ユーザ定義のオブジェクト

で何らかのアクションが発生した場合，Signal（マウスがを容易に取り込むことができます．

クリックされた等の信号）に connect（接続）された SloteDAS では，Python 標準のライブラリに加えて，いくつ（動作）が実行されます．上のサンプルコードでは，ボタンかの外部パッケージを利用しています．eGIS，eSURF，widget がクリックされた場合（clicked）に，connect 先のeSLICE の各ツールにおけるグラフ作成およびグラフのカ

動 作（clicked̲btn̲action メ ソ ッ ド）が 実 行 さ れ ま す．

スタマイズに matplotlib を，eDAS 内の配列演算に numpy

eDAS は，あらゆるイベント管理をこのような PySide ベー［２］を，MHD 揺動のスペクトル解析などの科学計算処理のスの widget で構成された GUI として実装しており，特にために scipy［３］を用いています．また，図１に示す各 DB

DB アクセスやグラフ描画をインタラクティブな操作で行とのデータの入出力に関しては，Python 標準のライブラ

えるように開発しています．次節では，eDAS の各ツールリである ctypes［４］を利用して，DB アクセスライブラリ本の紹介を述べていきますので，読者の皆さんには，Python

体に wrapper 処理することで eDAS に接続しています．
そして，汎用ソフトウェアでは GUI を用いたインタラク
ティブな操作が求められるため，eDAS では全体の GUI
構築とイベント管理のために PySide［５］を導入しています．PySide は Python で GUI 開発を行うためのライブラリ
であり，特徴としてクロスプラットフォームに対応したア
プリケーションの開発が行えることが挙げられます．ここでは非常にシンプルな GUI プログラムを紹介します．
from PySide import QtGui
class simpleBtnWidget(QtGui.QWidget):# PySide の QtGui.QWidget を継承したクラス
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)# レイアウトの設定
self.setLayout(QtGui.QVBoxLayout())# ボタンwidget の作成
self.this_btn = QtGui.QPushButton(”
Push”, parent=self)
図３２１７放電波形 描 画 ツ ー ル（eGIS）の ユ ー ザ イ ン タ ー フ ェ ース．磁気プローブ信号から MHD 揺動解析を行っている例．

Journal of Plasma and Fusion Research Vol.94, No.4 April 2018

でこのようなことができるという感触を掴んでいただければ幸いです．

４．
２．
２ eDAS の機能
図２に示した通り，eDAS の各ツールはその主幹部を共有 し て い ま す が，エ ン ド ユ ー ザ か ら 見 た 場 合 に は，eGIS，eSURF，eSLICE の３つのツールが独立に存在しているように見えます．紙面の都合上，機能の詳細を説明することはできませんが，ここでは各ツールの概要を順に述べたいと思います．
図３に示すのは，放電波形描画ツール（eGIS）のユーザ
インターフ ェ ー スで す．eGIS は，解 析 す る シ ョ ット番
号，データ名等を GUI 上で指定し，DB からデータを取得
してグラフ描画を行う基本的なツールです．単に取得したデータを表示するだけでなく，例えば複数の実験データからグリンワルド密度の時系列データを作成・プロットするなど，簡単な演算を行うこともできる設計になっていま

図４

プ ラ ズ マ 平 衡 解 析 ツ ー ル（eSURF）の ユ ー ザ イ ン タ ー
フェース．平衡 DB との入出力や計測視野及び NBI の軌道，
ECH の共鳴面等を表示する．

図５

プラズマ空間分布解析ツール（eSLICE）のユーザインター
フェース．計測データを磁気面上にマッピング処理し，空間分布として描画する．

す．図３では，MHD 揺動解析のために磁気プローブ信号
をスペクトル分析している様子を表しています．また，
図１に示すように，eDAS はデータの種類に応じた様々なDB にアクセス可能なため，実験 DB 上の計測データと輸送
コード等で計算した解析 DB 上のシミュレーション結果をグラフで比較することもできる仕様になっています．
図４に示すのは，プラズマ平衡解析ツール（eSURF）のユーザインターフェースです．eSURF は，解析するショッ
ト番号，時刻等を GUI 上で指定することで，プラズマの平衡データを作成し，その磁束分布を描画する他，既に平衡
DB に格納された平衡データを呼び出すツールです．例えばレファレンスとなる磁束分布と実験結果を比較する他，
平衡パラメータの数値テーブルを表示したり，各種の計測
視野や NBI の軌道，ECHの共鳴面等を平衡データ上に描画する機能を持っています．また，JT-60SA では，放電終了
後に各放電の平衡計算を自動的に行い，平衡データの時系
列 デ ー タ を 逐 次 DB に 格 納 す る 予 定 で あ り（図１の

４．
２．
３ まとめ

FAME）
，eSURF ではこの時系列データを読み込み，アニ

本章では JT-60SA において Python を利用した汎用デー

メーションとして描画することもできる仕様になっていま

タ解析ソフトウェア（eDAS）について述べました．eDAS

す．
図５に 示 す の は，プ ラ ズ マ 空 間 分 布 解 析 ツ ー ルは汎用としての多様な機能を有する一方で，イベント管理（eSLICE）のユーザインターフェースです．eSLICE は，解された小さなコンポーネントの集合体に過ぎません．１つ

析するショット 番 号，時 刻 等 を GUI 上 で 指 定 す ることだけ注意しなければならないのは，データ解析の目的が多で，実験 DB から呼び出した多チャンネル計測器のデータ

岐にわたるため，機能の拡張性を想定した設計になっていを，平衡 DB から読み込んだプラズマの磁気面上にマッピる必要があるという点です．研究活動の進展に伴って，解ング処理，またはアーベル変換によって，空間分布として

析手法が変化する他，各種の DB や機器類，そして実験装描画するツールです．マッピングデータをフィッティング

置自体も改良されていくため，ソフトウェアはそれらの変する際にも係数をシークバーで変動させる等，インタラク化に対して柔軟に対応できる仕様が求められます．eDAS

ティブに最適な条件を調整できるようなGUIを導入していはこのような機能拡張に関するオブジェクトをプラグイン

ます．さらに，図１に示すように，eSLICE にはマッピング形式で採用する設計になっています．

及びフィッティングされた空間分布データが解析 DB に格図１に示した eDAS は基本的に JT-60SA の解析サーバ上納された後，各種の輸送コード用の入力ファイルを作成すでの利用を想定した図になっていますが，Python は様々る機能を有しています．

な OS との互換性を持つため，リモートでの実験参加者に
eDAS をパッケージとして配布し，専用の DB アクセスモ
ジュールを通してデータの入出力を行いながら，リモート
２１８

Lecture Note

4.2 Application of Python in JT-60SA Experiment

H. Urano

PC 側で eDAS を実行することも将来的にできるように設最後に本章を執筆するにあたり，高度情報科学技術研究

計しています．そのため，eDAS の開発ではLGPLライセン

機構の若狹有光氏，並びにデジタルサーブ株式会社の阪本スで使用することができるフリーのライブラリのみを利用

三姫氏の両者には，JT-60SA のための eDAS 開発及び DB

しています．

開発における技術支援スタッフとして協力していただきま

また，研究所内外のユーザが利用する汎用ソフトウェア

した．感謝いたします．

の場合は，イベント管理をwidgetで構成されたGUIとして

参考文献

実装し，特にデータアクセスやグラフ描画をインタラク
ティブな操作で行えるように開発することが重要です．特［１］H. Shirai et al., Nucl. Fusion 57, 102002 (2017).
［２］http://www.numpy.org［３］https://www.scipy.org［４］https://docs.python.org/2/library/ctypes.html［５］https://wiki.qt.io/PySide/jaに図１に示すように複数の DB を利用するような環境であっても，シンプルなデータアクセスの構造を GUI 上に仮想的に持ち込むことでユーザ側からは複雑なデータ構造を意識せずにデータ解析を行えるような工夫が重要となってきます．

!!!!!!!!!!!!!!!!

の

はじめ

浦 野

うら

創

量子科学技術研究開発機構那珂核融合研究
所上席研究員．工学博士．２
００２年北海道大学大学院工学研究科博士課程修了．独国
Max Planck 研究所，日本原子力研究開発機
構を経て現職．専門は周辺プラ ズ マ 物 理，閉 じ 込 め 物 理
等．２
０１
１年 国 際 原 子 力 機 関 よ り Nuclear Fusion Award 受
賞．２
０１
７年より ITPA 周辺ペデスタル物理 TG 議長．最近は子どもたちにマジックを見せて笑顔にさせるのが楽しい．

!!!!!!!!!!!!!!!!

!!!!!!!!!!!!!!!!!!!!!!!!!!

!!!!!!!!!!!!!!!!!!!!!!!!!!

２１９

J. Plasma Fusion Res. Vol.94, No.4 (2018)２
２０‐２２１

講座 今日からはじめる Python

５．おわりに
5. Summary
吉沼幹朗
YOSHINUMA Mikirou
核融合科学研究所（原稿受付：２
０
１
８年２月２
６日）

ここでは，Python をさらにどの程度まで学べばよいか

これらについて多くのことは Web 上で検索することでの指針を示します．また，本講座を通して理解していただ

解決すると思います．ひと通り学ぶなら，Python の公式

きたいことを述べます．

ページのドキュメント（https://docs.python.org/ja/3/）を読むことをお勧めします．本で学ぶなら，『初めての Py-

５．
１ 学習の指針

thon 第３版』［１］には Python についての詳細が書かれていこの講座は，Python を始めてみようかと考えている人

ます．Python についてだけでなく機械学習などの応用まに向けて書かれました．さらに Python を学ぶ人のために，で含めた形での入門書としては，『みんなの Python 第４どこまで学んだらよいかを少し書きたいと思います．

版』［２］がよいでしょう．また，Numpy や pandas を用いた

本講座では，詳しい関数の定義（可変長引数，キーワー

データ分析について『Python によるデータ分析入門』［３］

ド引数をもつ関数の定義）やオブジェクト指向プログラミがあります．Python やよく利用されるモジュールは日々ングで用いられるクラス定義については説明しておりませ

更新されていますので，なるべく新しく出版された書籍をん．また環境に依存してくるため C 言語や Fortran で記述読むことをお勧めします．

された自作の関数を，Python から呼び出す方法などにつ５．
２ おわりにいても説明しませんでした．簡単なデータ処理は，対話型
環境に手続き的に（処理を並べるように）記述するだけでプログラミングといっても，大きく二つの立場があると済みます．しかし，複雑な処理を見通しよく記述するなら，思います．一つは，製品を生み出すためのプログラミング，

関数の定義について学ぶとよいでしょう．関数の定義まで

もう一つは，思考の道具としてのプログラミングです．前

わかれば，我々が行うほとんどのことを Python で行える

者は，プログラミングの専門家が仕様に沿ってパグのないと思います．

プログラムの作成をめざすものです．後者は，データの理関数の定義ができるようになったら，モジュールや名前解のために，試行錯誤しながら手続きを施し，結果を観察

空間について学んでください．すなわち，import 文の動作

していく，道具としてのプログラミングです．プログラミについてです．便利なモジュールを扱うときに，ストレスングの専門家ではない実験家が行いたいのは後者のプログを感じにくく な る で し ょ う．自 分 で 作 成 し た 関 数 をモ

ラミングでしょう．

ジュールとして別ファイルにしてコレクションすることも実験データを観察しながら，解析手法を考え，思いついできるよ う に な りま す．Python で は，ク ラ ス を 定義したアイディアを実行するためのスクリプトを書き，それをて，オブジェクト指向のプログラミングもできますが，既適用した結果をまた観察する．これを多くのデータに対し存のモジュールで提供されるオブジェクトを利用できる程て，繰り返し適用してみたりする．手動でデータを処理す度に理解されていれば，実用上問題ないでしょう．多くのるには，少しめんどくさい量でも，スクリプトにしてしま

人が理解できるスクリプトという意味では，ここまでの知

うと，気軽に間違わずに何回でも処理できます．自分でス

識で処理を記述することをお勧めします．

クリプ卜を書けば，どうしてそのような出力が得られたのより汎用に利用できるモジュールを作成したり，既存のかも考えられるでしょう．このような作業を行うことに，

モジュールを調べたりしたいときは，オブジェクト指向やPython は適しています．処理の本質的でない部分に対すクラスの定義について詳細を学んでください．例外処理

るプログラミング（型の指定やメモリの確保など）にあま（エラーが起きた場合の対処），匿名関数（ラムダ式），関

り気を取られずに記述できます．子ども向けの Python の

数アノテーションなどより高度な機能が使われることもあ

解説書［４］も出ていることから，プログラミングの専門家

ります．

ではない人でも容易に扱えるものと感じています．その作

National Institute for Fusion Science,Toki, GIFU 409-5292, Japanauthor’s email:yoshinuma@nifs.ac.jp

２２０!2018 The Japan Society of Plasma
Science and Nuclear Fusion ResearchLecture Note

5. Summary

M. Yoshinuma

成された処理を誰でも実行でき，それについて議論するこ

参考文献とができます．
こ の 講 座 を 読 ん で，誰 で も す ぐ に 試 す こ と の で きる

［１］M. Lutz（著），夏目 大（翻訳）：初めての Python ヘ第３版（オライリージャパン，２０
０
９）．
［２］柴田 淳：みんなの Python ヘ第４版（SB クリエイティ
ブ，２
０
１
６）
．
［３］W. McKinney（著），小 林 儀 匡（翻 訳），鈴 木 宏 尚（翻訳），瀬戸山雅人（翻訳），滝口開資（翻訳），野上大介（翻訳）：Python によるデータ分析入門‐NumPy,pandas を使ったデータ処理（オライリージャパン，２００３）．
［４］J.R. Briggs（著），磯蘭水（翻訳），藤永奈保子（翻訳），鈴木悠（翻訳）：たのしいプログラミング Python では
じめよう！（オーム社，２
０
１
４）
．

Python というプログラミング言語環境があって，それは容易に学ぶことができるものであり，すでにプラズマ・核融合分野でも使っている人が多くいることを理解していただけたでしょうか．Python を用いて，皆さんの手元にある実験データを読み込み，いろいろな解析のアイディアを試していただくことを願っています．
最後になりますが，Python やそのモジュールを作成されている，各オープンソースコミュニティに感謝いたします．この講座を連載する機会を作り，とりまとめていただ
きました，九州大学稲垣滋教授に感謝申し上げます．

!!!!!!!!!!!!!!!!!

よし

ぬま

みき

ろう

吉 沼 幹 朗核融合科学研究所，ヘリカル研究部，助教．２
０００年，東北大学大学院工学研究科電気・通信工学専攻博士課程修了．LHD において中性粒子ビームを用いたプラズマ計測（荷電交換分光，モーショナルシュタルク効果分光）を行っています．特にプラズマ中の流れや電場構造の形成に関心をもって研究を行っています．LHD の実験シーケンスに同期させた解析プログラムの実行や解析データの可視化に Pythonを利用しています．

!!!!!!!!!!!!!!!!!

!!!!!!!!!!!!!!!!!!!!!!!!!!

!!!!!!!!!!!!!!!!!!!!!!!!!!

２２１