Skip to content

Commit

Permalink
Remove about class construction.
Browse files Browse the repository at this point in the history
Added summary.
  • Loading branch information
fujiisoup committed Oct 17, 2017
1 parent bc52e8e commit d346dd1
Show file tree
Hide file tree
Showing 4 changed files with 77 additions and 101 deletions.
18 changes: 12 additions & 6 deletions chapter2/introduction.rst
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
Jupyter-notebook
======================
対話的開発環境 Jupyter-notebook
===============================================

Jupyter-notebookは、
対話的プログラミング環境を提供するオープンソース・ソフトウェアである。
本章では対話的プログラミング環境の1つである Jupyter-notebook を紹介する。
Jupyter-notebook は

+ 実行結果を可視化しながらデータ解析を進めることができる
+ ソースコード、実行結果、グラフ、数式、文書を1つのファイルに保存することができる
Expand All @@ -28,6 +28,13 @@ https://losc.ligo.org/s/events/GW150914/GW150914_tutorial.html
プログラムスキルを身に付けるためにも非常に効果的である。

本章では、Jupyter-notebookを用いてPythonの基本的な文法・使用法を学ぶ。
なお本章では、文法の厳密な定義を積み重ねていくというよりは、
まずは動くコードを示し、その結果を見ながら文法を大雑把に解説することにした。
Jupyter-notebookのような対話的開発環境では、実行結果がすぐに表示されるため、
試行錯誤が容易である。
Pythonの使用法を学ぶという読者にも、まずは以下に示すようにコードを実行してその結果を観察し、
そこからその内容を理解する、といった体験型の学習を進める。



----------------------------------------
Expand Down Expand Up @@ -130,8 +137,7 @@ Cell > Cell type からマークダウンセルを選択する。
を記入し、同様にセル内で Shift + Enter を押下する。
文章と数式が表示されたと思う。
本講座ではマークダウンについての説明は省略するが、かなり単純化されたHTMLやTeXを想像すれば
よい。
本講座ではマークダウンについての説明は省略するが、かなり単純化されたHTMLやTeXを想像すればよい。
特にこのマークダウンセルは、
ノートブックを公開する時などデータ解析の内容を詳細に記述するときに重要である。
現に、上記の重力波検出データのノートブックでは、マークダウンセルが半数以上を占める。
Expand Down
19 changes: 17 additions & 2 deletions chapter2/summary.rst
Original file line number Diff line number Diff line change
@@ -1,7 +1,22 @@
まとめ
===========

本章では、Jupyter-notebook を用いたPythonの基本的な文法と使用法を概観した
本章では、Jupyter-notebook を用いることで Python の基本的な文法と使用法を概観した
Jupyter-notebookのような対話的な環境では書き間違いなどによるバグがすぐに見つかるため、
特にプログラミングに不慣れな人にとっても効果的である。
本章で紹介した例などをぜひ実行してほしい。

本章では、python の基本的な文法のみを紹介したのみで、
例えばクラスの定義法やオブジェクト指向が何たるかなどは詳しく述べなかった。
Pythonでは、numpy や matplotlib などの多様なパッケージが用意されており、
それらを用いることで一般的なデータ解析には十分なことが多い。

データ解析では試行と可視化の繰り返しが重要である。
特に、実験データ・シミュレーションデータのように
いろいろな解析を試して、データが持つ意味を抽出する必要がある場面では、
精緻なプログラムを構築するというよりは、
外部パッケージを使って解析結果を素早く可視化するというサイクルを
高速に回す方が重要であることが多い。

そのため、これから python を学ぶ読者も、その厳密な文法を学ぶよりは、
以降の章で説明する外部パッケージを用いてまずは実際のデータを解析してみて、
その結果を見ながら徐々に言語に慣れていくという方針をとるとよいように思う。
139 changes: 47 additions & 92 deletions chapter2/tutorial5.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2,124 +2,79 @@ Python スクリプトの階層構造
============================

Python はオブジェクト指向の言語であり、いくつかの階層構造がある。
例えば、numpy などのライブラリは、パッケージとして提供される
各パッケージには、モジュールと呼ばれるソースコード郡が複数含まれる
例えば、numpy の線形代数モジュールは linalg という名前で提供される。
例えば、numpy などのライブラリは、「パッケージ」と呼ばれる大きなコード群して提供される
各パッケージには、「モジュール」と呼ばれる小さなコード郡が複数含まれることが多い
例えば、numpy の線形代数モジュールは ``linalg`` という名前で提供される。

さらに、各モジュールにはクラスが定義されていることがあり
その中に変数や関数(クラスに付属する関数はメソッドと呼ばれる)。
さらに、各モジュールには「クラス」が定義されていることがあり
その中に変数や関数(クラスに付属する関数はメソッドと呼ばれる)が含まれる

クラスは、オブジェクト指向プログラミングに必要な重要な概念であるが、
少し発展的な内容を含むため、ここでは深くは紹介しない。
ただし多くのライブラリではクラスが用いられているため、その使用法のみを紹介する
発展的な内容を含むため、ここでは深くは紹介しない。
ただし多くのライブラリでは用いられることが多いため、その使用法を簡単に紹介する


上でNumpyのsin関数を実行する際、np.sin()
パッケージ内・モジュール内へのアクセス
----------------------------------------------------------

これまでnumpyのsin関数を実行する際、``np.sin()`` を実行した。
これは、numpy パッケージ内に定義されている sin 関数を呼び出すための記法である。
ここで「.」は、1つ下の階層への移動を意味するもので、この例の場合
「パッケージ名.関数名」
という形式でアクセスしていることになる。

.. ipython:: python
:suppress:
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(123456)
同様に、numpy パッケージ内の fft モジュール内の 実数に対する高速フーリエ変換
rfft を実行するためには ``np.fft.rfft`` というように
「パッケージ名.モジュール名.関数名」
と言う形式でアクセスできる。

クラス(class)とは、(複数の)データと
そのデータに関する関数(メソッドと言う)をひとまとめにした
オブジェクトである。
オブジェクト指向プログラミングの第一歩はクラスを学ぶところから始まる。
ここでは、そのさわりを簡単に述べる。


クラスの例 np.ndarray
クラスの使い方 np.ndarray
-------------------------------

まずは、クラスがどのようなものか理解するため、その例として`np.ndarray`のメソッドを紹介する。
クラスはオブジェクト指向の重要な概念であるが、
その定義を説明する前に、ここではまずその一例である ``np.ndarray`` を再度紹介する。

.. ipython:: python
x = np.linspace(0,1,12)
x
y = x.reshape(4,3)
y
ここで reshape はメソッドであり、x の持つ値を変形したものを返すものである。
もちろん同様の操作は関数だけを用いても行うことができるが、その場合
get_reshaped_array(src, src_shape, dtype, target_shape)
というように、変形したいデータ(src)に関するたくさんの変数(srcの値、srcの大きさ、変数の型)
を全て指定する必要があり、ソースコードが冗長になる。

クラスという概念では、
np.ndarray というオブジェクトの中に、データの他、
変数の型や大きさなど必要な情報をひとまとめにして格納しておく。
そのオブジェクトのメソッドでは、それらの値を用いることができるため、
プログラムが簡潔になり、バグが少なくなる。
(複雑なプログラムを作成するためのコツは、
 くだらないバグをなくす行為にできるだけリソースを割かないようなシステムにすることである。)
ここで、xは12個の要素からなる1次元ベクトルである。

クラスの定義
---------------------
言葉の定義を少し明確にしておく。
「クラス」は型名のことであり、x のクラスは ``np.ndarray`` である。
一方、x は ``np.ndarray`` 型を持つ変数である。
オブジェクト指向の言語ではこの変数のことを「オブジェクト」や「インスタンス」と呼ぶことが多い。

ここでは例のため、極座標のクラスを作成しよう。
各オブジェクトは、内部に変数や関数などの別のオブジェクトを有していることが多い。
例えば ``np.ndarray`` のオブジェクトは、
アレイの大きさや次元数などをオブジェクトとして有している。

.. ipython:: python
class PolarCoordinate(object):
def __init__(self, r, theta):
"""
An object that handles polar coordinate in 2d-space,
a radial coordinate(s) r and angular coordinate(s) theta.
"""
self.r = r
self.theta = theta
|
def to_xy(self):
"""
Convert to polar coordinate (r, theta) to x-y coordinate values.
Returns x and y as a tuple.
"""
return self.r * np.cos(self.theta), self.r * np.sin(self.theta)
|
def to_complex(self):
"""
Convert to complex values.
"""
return np.complex(self.r * np.cos(self.theta),
self.r * np.sin(self.theta))
__init__ メソッドは、
クラスをインスタンス化(実体を持つ変数として確保すること)時に実行されるメソッドである。
今回作成したクラスの__init__メソッドは self, r, theta の3つの引数を必要とする。
self は、このオブジェクト自体を指すものであり、
Python のメソッドのひとつ目の引数は基本的には self とすることになっている。

メソッド内では、self を通して自らのオブジェクトにアクセスする。
例えば

.. code-block :: python
self.r = r
では、PolarCOordinate 内に変数 r を定義し、その値として__init__メソッドに渡された
rを代入することを示している。

クラスオブジェクトをインスタンス化するためには
x.shape # x の形状
x.ndim # x の次元数
.. ipython:: python
polar = PolarCoordinate(1.0, 0.5 * np.pi)
このように、オブジェクト内部のオブジェクトには
「オブジェクト名.オブジェクト名」
というように「.」を使うことでアクセスできる。

というように、クラス名(引数) を実行する。なお、self引数は省略する。
クラス内の変数には . (ドット)を通してアクセスできる。
メソッドはそれ自身の値を操作する関数である。
例えば、12要素を持つ1次元ベクトルを 3x4 要素を持つ2次元行列に並び替えるには、``reshape``
メソッドを実行すれば良い。
メソッドにも「.」を用いてアクセスできる。

.. ipython:: python
polar.r
また、to_xy などもメソッドであり、. を通して呼び出すことができる。
y = x.reshape(4,3)
y.shape
y
.. ipython:: python
この ``reshape`` のように、一般的にメソッドは、自分自身(ここではオブジェクトx)と、
それに加えて引数(ここでは 4, 3)を受け取り、
何か戻り値(ここでは別のnp.ndarray型のオブジェクト y)を返す関数である。

polar.to_xy()
本講座では、クラスをどのようにして定義するかなどは省略するが、
クラスはデータ(上の例ではxに格納されている値)と機能( ``reshape`` などのメソッド)
をひとまとめにしたものであると理解できれば、外部パッケージの使用には十分である。
2 changes: 1 addition & 1 deletion index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
対話的開発環境 Jupyter-notebook
対話的開発環境と Python の基本的な文法
=======================================

.. toctree::
Expand Down

0 comments on commit d346dd1

Please sign in to comment.