Python(基本的なこと004: numpyライブラリの簡単なサンプル)

■numpyライブラリを試してみる。
今回はnumpyのライブラリを試してみる。前回の素数定理にからめて何かできないか考えてみたけど思いつかなかったので、とりあえず簡単なコードでnumpyを試してみた。使ったコードと結果は下の通り。

import numpy as np

a = np.arange(8).reshape(2, 4)
print(a)
print(a.shape)
print(a.ndim)
print(a.size)
print(a[0])
print(a[0][1])

a = a * 2
d = a.reshape(4, 2)
print(d)
print(d.shape)
print(d.ndim)
print(d.size)

print("==============================")
b = np.array([[1, 2],
              [1, 2],
              [3, 3],
              [1, 1]])
c = a @ b
print(c)
print(c.sum())
print(c.max())
print(c.min())

print("==============================")
for var in c:
    print(var)

for var in c.flat:
    print(var)

print("==============================")
e = np.array([[[1, 1],
               [1, 2]],
              [[1, 1],
               [1, 2]],
              [[1, 1],
               [1, 2]]])
print(e.ndim)
print(e.size)

numpyを少し使ってみてリストのようなものかと思ったけど、どうやらこれは行列の計算を行うものらしい。高校数学の終わりで出てきたあれ。多分、機械学習では行列計算が出てくるのだろうけど、これに特化したライブラリというイメージ。

簡単にコードのメモ。
まず、a = np.arange(8).reshape(2, 4)で、0から7までの数値で2行4列の行列を作り表示。見た目は2次元配列...というか配列そのものなのかなー。
   [[0 1 2 3]
   [4 5 6 7]]
a.shapeで行列の形の表示。この場合、2行4列で(2,4)、a.ndimで次元数を表示([の数からみて2、コードの下の方のeは3次元の例)。a.sizeは要素の数(4×2=8)。配列と同様に、a[0]、a[0][1]で要素が得られる。
a * 2で各要素が2倍になる。
   [[0 1 2 3]  →   [[0 2 4 6]
   [4 5 6 7]]       [8 10 12 14]]
a.reshape(4, 2)で、形を変えることができる。この場合は2行4列から4行2列に変更。

もう一つ行列(b)を用意し、a @ bで行列の計算を実施。aの1行目(横:0 2 4 6)とbの1列目(縦:1 1 3 1)を計算すると、0 * 1 + 2 * 1 + 4 * 3 + 6 * 1 = 20で、cの1行1列目が20となる。他も同様に計算すると、2行2列のcができる。
   [[20 22]
    [68 86]]
c.sum()で要素の合計、c.max()、c.min()でそれぞれ最大、最小が得られる。

numpyの公式サイトでも、リストとの差異の説明などがあった。numpyはサイズが固定されており、同じデータタイプを持つもの、大量のデータを扱うことができ、さまざまな他のライブラリでも使用されるそう。
何となくnumpyのイメージはできてきたけど、行列を応用するイメージがわかない。大学では線形代数学として行列が出てきたけど、あまり応用的に使った記憶はないなー。