1章 Python 入門

1.3 Python インタプリタ

※コマンドラインではなくてインタプリタ(REPL や Jupyter notebook 等)上でバージョン確認するには sys.version を見れば良い。

In [2]:
import sys
In [3]:
sys.version
Out[3]:
'3.6.0 |Continuum Analytics, Inc.| (default, Dec 23 2016, 12:22:00) \n[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)]'
In [4]:
1 + 2
Out[4]:
3

1.3.1 算術演算

In [5]:
1 - 2
Out[5]:
-1
In [6]:
4 * 5
Out[6]:
20
In [7]:
7 / 5
Out[7]:
1.4
In [8]:
3 ** 2
Out[8]:
9

※補足:整数除算は // 演算子が利用できる。

In [10]:
7 // 5
Out[10]:
1

1.3.2 データ型

In [11]:
type(10)
Out[11]:
int
In [12]:
type(2.718)
Out[12]:
float
In [13]:
type("hello")
Out[13]:
str

1.3.3 変数

In [14]:
x = 10
In [15]:
print(x)
10
In [16]:
x = 100
In [17]:
print(x)
100
In [18]:
y = 3.14
In [19]:
x * y
Out[19]:
314.0
In [20]:
type(x * y)
Out[20]:
float

1.3.4 リスト

In [21]:
a = [1, 2, 3, 4, 5]
In [22]:
print(a)
[1, 2, 3, 4, 5]
In [23]:
len(a)
Out[23]:
5
In [24]:
a[0]
Out[24]:
1
In [25]:
a[4]
Out[25]:
5
In [26]:
a[4] = 99
In [27]:
a
Out[27]:
[1, 2, 3, 4, 99]
In [28]:
a[0:2]
Out[28]:
[1, 2]
In [29]:
a[1:]
Out[29]:
[2, 3, 4, 99]
In [30]:
a[:3]
Out[30]:
[1, 2, 3]
In [31]:
a[:-1]
Out[31]:
[1, 2, 3, 4]
In [32]:
a[:-2]
Out[32]:
[1, 2, 3]

1.3.5 ディクショナリ

In [33]:
me = {'height': 180}
In [34]:
me['height']
Out[34]:
180
In [35]:
me['weight'] = 70
In [36]:
me
Out[36]:
{'height': 180, 'weight': 70}

1.3.6 ブーリアン

In [37]:
hungry = True
In [38]:
sleepy = False

1.3.X タプル

※データ型の説明中にタプルが出てこなかったので、実例を挙げて説明。

In [39]:
(x, y)
Out[39]:
(100, 3.14)
In [40]:
type((x, y))
Out[40]:
tuple
In [41]:
(x, y, 1, 2, 3, "a", True)
Out[41]:
(100, 3.14, 1, 2, 3, 'a', True)
In [42]:
type((x, y, 1, 2, 3, "a", True))
Out[42]:
tuple

1.3.7 if 文

In [45]:
hungry = False
In [46]:
if hungry:
    print("I'm hungry.")
else:
    print("I'm not hungry.")
I'm not hungry.

1.3.8 for 文

In [49]:
for i in [1, 2, 3]:
    print(i)
1
2
3

※タプルも for 文(の in 句)に渡せる。

In [54]:
for i in (x, y, 1, 2, 3, "a", True):
    print(i)
100
3.14
1
2
3
a
True

1.3.9 関数

In [47]:
def hello():
    print("Hello World!")
In [48]:
hello()
Hello World!
In [52]:
def hello(object):
    print("Hello " + object + "!")
In [53]:
hello("cat")
Hello cat!

1.4 Python スクリプトファイル

1.4.1 ファイルに保存

※Jupyter notebook を利用する場合、新たにテキストエディタを起動する必要はない。

  • ディレクトリのファイルリストが表示されている画面で、[New]→[Text File] を選択すると、簡易テキストエディタ画面になる。名前を付けて新しいテキストファイルとして保存できる(もちろん .py ファイルも作れる)
  • ディレクトリのファイルリストが表示されている画面で、テキストファイルを選択すると、↑と同様テキストエディタ画面が開き、編集できる。
  • 短い内容なら、↓のようにすれば notebook 上で直接ファイルを作成(存在すれば上書き保存)することも可能。
In [56]:
%%file hungry.py
print("I'm hungry!")
Overwriting hungry.py

※↓.pyファイルの内容を表示

In [58]:
%pycat hungry.py

※↓.pyファイルを実行し結果を表示

In [124]:
%run -i hungry.py
I'm hungry!
<matplotlib.figure.Figure at 0x7f5d34a01eb8>

1.4.2 クラス

※テキストでは man.py というファイルに保存して実行とあるが、ここでは直接 notebook にクラスを記述し、各セルで実行

In [61]:
class Man:
    def __init__(self, name):
        self.name = name
        print("Initialized!")
    
    def hello(self):
        print("Hello " + self.name + "!")
    
    def goodby(self):
        print("Good-bye " + self.name + "!")
        

※↑ class の定義は1つのセル内に全部書く。複数のセルにまたがることは出来ない。

In [62]:
m = Man("David")
Initialized!
In [63]:
m.hello()
Hello David!
In [65]:
m.goodby()
Good-bye David!

1.5 NumPy

1.5.1 NumPy のインポート

In [66]:
import numpy as np

1.5.2 NumPy の配列の生成

In [67]:
x = np.array([1.0, 2.0, 3.0])
In [68]:
print(x)
[ 1.  2.  3.]
In [69]:
type(x)
Out[69]:
numpy.ndarray

※ここで質問:「np.arraynumpy.ndarrayの違いは?」
→回答「numpy.ndarrayは型、np.arraynumpy.ndarray型のオブジェクトを生成する便利なメソッド」

1.5.3 NumPy の算術計算

In [70]:
x = np.array([1.0, 2.0, 3.0])
y = np.array([2.0, 4.0, 6.0])
In [71]:
x + y
Out[71]:
array([ 3.,  6.,  9.])
In [72]:
x - y
Out[72]:
array([-1., -2., -3.])
In [73]:
x * y
Out[73]:
array([  2.,   8.,  18.])
In [74]:
x / y
Out[74]:
array([ 0.5,  0.5,  0.5])
In [75]:
x / 2.0 # ブロードキャスト
Out[75]:
array([ 0.5,  1. ,  1.5])

1.5.4 NumPy の N 次元配列

In [76]:
A = np.array([[1, 2], [3, 4]])
In [77]:
print(A)
[[1 2]
 [3 4]]
In [78]:
A.shape
Out[78]:
(2, 2)
In [79]:
A.dtype
Out[79]:
dtype('int64')
In [80]:
B = np.array([[3, 0], [0, 6]])
In [82]:
A + B
Out[82]:
array([[ 4,  2],
       [ 3, 10]])
In [83]:
A * B
Out[83]:
array([[ 3,  0],
       [ 0, 24]])
In [84]:
A * 10
Out[84]:
array([[10, 20],
       [30, 40]])

1.5.5 ブロードキャスト

In [85]:
A = np.array([[1, 2], [3, 4]])
In [86]:
B = np.array([10, 20])
In [87]:
A * B
Out[87]:
array([[10, 40],
       [30, 80]])

※↑は仮想的に↓と同じ意味、というコード(テキストに載っていないものを説明のために記述)

In [88]:
B2 = np.array([[10, 20], [10, 20]])
In [90]:
B2
Out[90]:
array([[10, 20],
       [10, 20]])
In [89]:
A * B2
Out[89]:
array([[10, 40],
       [30, 80]])

1.5.6 要素へのアクセス

In [98]:
X = np.array([[51, 55], [14, 19], [0, 4]])
In [92]:
X
Out[92]:
array([[51, 55],
       [14, 19],
       [ 0,  4]])
In [93]:
X[0]
Out[93]:
array([51, 55])
In [95]:
for row in X:
    print(row)
[51 55]
[14 19]
[0 4]
In [99]:
X = X.flatten()
In [100]:
X
Out[100]:
array([51, 55, 14, 19,  0,  4])
In [101]:
X[np.array([0, 2, 4])]
Out[101]:
array([51, 14,  0])
In [105]:
X[0:4:2]
Out[105]:
array([51, 14])
In [103]:
X > 15
Out[103]:
array([ True,  True, False,  True, False, False], dtype=bool)
In [104]:
X[X>15]
Out[104]:
array([51, 55, 19])

1.6 Matplotlib

1.6.1 単純なグラフの描画

In [106]:
%matplotlib inline
import matplotlib.pyplot as plt
In [107]:
x = np.arange(0, 6, 0.1)
y = np.sin(x)
In [108]:
plt.plot(x, y)
# plt.show()
Out[108]:
[<matplotlib.lines.Line2D at 0x7f5d34b08198>]

※↑テキストには %matplotlib inline の行がなく、最後の plt.show() がコメントアウトされていない。
これは Jupyter の機能で、%matplotlib inline を記述しておくとグラフがセル単位でまとまり、plt.show() を書かなくてもそのセルで定義したグラフがそのセルの出力として描画される。便利。

1.6.2 pyplot の機能

In [109]:
y1 = np.sin(x)
y2 = np.cos(x)
In [111]:
plt.plot(x, y1, label="sin")
plt.plot(x, y2, linestyle="--", label="cos")
plt.xlabel("x")
plt.ylabel("y")
plt.title('sin & cos')
plt.legend()
Out[111]:
<matplotlib.legend.Legend at 0x7f5d349a3e10>

※↑一連の plt.xxx() を1つのセルにまとめて記述している点に注意。
これを複数のセルに分割してしまうと、それぞれのセルごとにグラフを描画してしまう。

1.6.3 画像の表示

In [112]:
from matplotlib.image import imread
In [113]:
img = imread('lena.png')
In [114]:
plt.imshow(img)
Out[114]:
<matplotlib.image.AxesImage at 0x7f5d345d0b38>

※「jpeg が表示できない(imread()でエラーになる)」という意見が出ました。
調査した結果、標準では jpeg は読み込めず、別ライブラリ Pillow が必要なようです。
用意した Dockerイメージ には含めていないのでそれを利用されている方は表示できません。実案件ではその環境も用意する必要があります。
この勉強会では特に重要ではない(おそらくこの先 .jpg ファイルを読み込むことはない)ので、このまま進めます。

1.99 補足

In [115]:
A
Out[115]:
array([[1, 2],
       [3, 4]])
In [116]:
B2
Out[116]:
array([[10, 20],
       [10, 20]])
In [117]:
A * B2
Out[117]:
array([[10, 40],
       [30, 80]])

※↑これがテキストに出てきた積(要素ごとの積、elementwise multiplication)。
↓(通常の)行列積は、こう書く。

In [118]:
A.dot(B2)
Out[118]:
array([[ 30,  60],
       [ 70, 140]])

※ベクトルで .dot() すると、内積(所謂「ドット積」)になる。

In [120]:
x = np.array([1, 2])
In [121]:
y = np.array([3, 4])
In [122]:
x.dot(y)
Out[122]:
11

※↓こんな計算も出来る(ドット積のブロードキャストになっている)

In [123]:
A.dot(x)
Out[123]:
array([ 5, 11])
In [ ]: