NumPyはPythonで数値計算を効率的に行うための拡張モジュールです。ここでは基本的な使い方をみていきます。基礎的な部分ですが一気にやっていきましょう。
Anacondaを使っているなら、NumPyはすでにインストールされているのではないかと思いますが、入っていなければターミナルからcondaコマンドやpipコマンドでインストールしましょう。
ここではjupyter notebookを使って操作していきます。起動の方法などを確認してください。
では、さっそくはじめていきましょう。
NumPyの基本的な使い方を一気に学ぶ
jupyter notebookを起動したら、まずはNumPyをインポートしましょう。(別にターミナルやIIDLEを使って対話型シェルで操作してもいいです。エディタで実行しても構いません。エディタの場合はprint文などで出力したり実行する手間がかかりますが、お好みでどうぞ)
import numpy as np
NumPyをインポートする時はこのように書くのがお決まりの文句になっています。このnpを使って計算していきましょう。
array()で配列を作る
配列はarray()にリストを入れて作ります。
import numpy as np
arr = np.array([1, 2, 3])
arr
(以降は特に必要が無ければ、numpyのインポートはいちいち記述しませんが、以降インポートしている状態であることを忘れないでください)
jupyter notebookのセルに記入しましょう。1行づつ別々のセルに書いてもいいですし、まとめて書いてもいいです。
[shift]+[return]キーで実行します。([control]+[return]キーでもいいですが、[shift]+[return]だと改行して次のセルも表示されます)
表示自体はそのまま囲んでいるだけですが、これが配列の表記になります。ちなみにこれは1次元の配列です。
配列なので、次のようにインデックスを指定すれば値を取り出すことができます。
arr[1]
次は多次元の配列を作ります。ここでは2次元配列です。同じ要素数のリストを追加するだけです。
arr = np.array([[1, 2, 3], [4, 5, 6]])
arr
縦に配列が並べられます。
インデックスを指定すれば、その位置の配列、配列の値を取り出せます。
arr[0]
arr[1]
arr[0][0]
次元の数はndim、次元とその値の数はshape、値の総数はsize、データのタイプを知るにはdtype.nemeで表示できます。
arr.shape
arr.ndim
arr.dtype.name
arr.size
arange()で配列を作る
arrange()を使うと、range()関数のように開始値、終了値、ステップ数を指定して、その指定の範囲の数値での配列を作ることができます。
0から30までの数値で5ごとの配列を作るのと、0から2までの数値で0.3ごとの配列を作るには次のように書きます。
np.arange(0, 30, 5)
np.arange(0, 2, 0.3)
zeros(), ones(), linspace(), nanで配列を作る
他にも配列を作る方法は色々あります。
zeros()
zeros()を使えば、値がゼロの配列を作ることができます。
3次元でゼロの値が4つの配列は次のように書いて作ります。
np.zeros((3, 4))
数字が「0」ではなく「0.」と小数点がついています。
次のように書くと、整数のみになります。
np.zeros((3, 4), dtype=np.int16)
ones()
値が「1」のみの配列を作るには、ones()を使います。
同様な形式で、3次元の1が4つの配列を作るにはこう書きます。
np.ones((3, 4), dtype=np.int16)
linspace()
linspace()を使えば、指定した範囲の中で等間隔で指定した個数の値を持った配列を作ることができます。
例えば、0から2までの間で等間隔に9つの値の配列を作るには次のように書きます。
np.linspace(0, 2, 9)
nan
ちょっと今までと違いますが、欠損値のリストを作るにはnanを使います。
np.nan
[np.nan] * 10
操作、演算をしてみる
ここからは、これまでの知識や新たな関数を使って組み合わせたり、演算してみたりしましょう。
3つの配列を用意します。
x = np.arange(0, 10, 2)
y = np.arange(5)
z = np.arange(0, 100, 20)
それぞれの配列は次のように示すことができます。
append()を使えば、これらの配列をつなぎ合わせることができます。
np.append(x, y)
vstack(), hstack()を使えば、それぞれ垂直方向と水平方向に組み合わせることができます。
np.vstack([x, y, z])
np.hstack([x, y, z])
次は2つの配列を用意します。
a = np.array([10, 20, 30, 40, 50])
b = np.arange(5)
これを次のように計算してみましょう。
a - b
b - a
b * 2
a * b
a < 30
結果はこうなります。
それぞれの値の位置が対応して計算されているのがわかると思います。最後はTrue or Falseで判定しています。
ones()を使って次の配列を作ってみます。
arr = np.ones((2, 3), dtype=int)
arr
これを次のように代入演算子を使って計算してみます。
arr *= 3
arr
それぞれの値が3倍されて代入されています。
0から1の範囲で乱数を発生させるにはrandomを使いますが、2次元で3つの値の配列を作るには次のように書きます。
arr = np.random.random((2, 3))
arr
0から1の間の数値でランダムに値が与えられています。
これを次のように計算してみましょう。順に合計、最小値、最大値、平均値です。
arr.sum()
arr.min()
arr.max()
arr.mean()
今度は次のような配列を考えてみます。
arr = np.arange(12).reshape(3, 4)
arr
これは0から11までの値を使った配列をarange()で作り、それを3次元の4つの値を持つ配列にreshape()を使って整えています。
これをsum()を使って合計する場合、axisを指定すると垂直方法と水平方向に計算することができます。
arr.sum(axis=0)
arr.sum(axis=1)
もう一度、元のこの配列を確認してみます。
これをrexize()で2次元の6つの値を持つ配列に変えるにはこう書きます。
arr.resize((2, 6))
arr
配列の縦と横を変換することもできます。これにはTを使います。
arr.T
0から23までの値で、2次元で3列、それぞれ4つの値を持った配列を作るには次のように書けます。
arr = np.arange(24).reshape(2, 3, 4)
arr
それでは次のように、大きな値を使って配列を作るとどうなるでしょうか。
np.arange(10000)
途中が…で省略された表示になります。
これを全て表示させるには次のように書き加えます。
np.set_printoptions(threshold=10000)
np.arange(10000)
ここでは途中までしか示しませんが、全て表示されることになります。
もちろん、これも次のようにreshapeしても全て表示することができます。
np.arange(10000).reshape(100, 100)
こちらも省略しましたが、全て表示されます。
最後に
NumPyの基本的な操作を簡単ですが一気に見てきました。
もちろん、これ以外にも様々な機能がありますので、ここで終わりではありません。そのあたりは、また別のところでじっくりやろうと思います。