Pythonを学び始めた頃はNumpyを積極的に使う場面が少なくて、「Pandasで十分じゃないか」と思っていました。
実際はいろいろな場面で使われるんですが…。
ここでは、Numpyの基本的な使い方を自分への備忘録も兼ねてまとめています。
使用するデータはこちらです。DataFrameで書いています。いわゆるドラクエです。

HPはヒットポイント、MPはマジックポイントです。
まずは1次元配列
Numpy配列の作成
HPのNumpy配列を作ります。np.array()のカッコ内にリストを入れて完成です。
import numpy as np
HP_arr = np.array([120, 110, 75, 50])
ちなみにarrはarray(配列)の略です。
エリアを絞る
1番目のデータを取り出したい場合
HP_arr[0]
120
範囲で指定すると、Numpy配列の形のままで取り出せます。
HP_arr[0:1]
array([120])
HP_arr[0:2]
array([120, 110])
データを上書きする
上書きも簡単にできます。
HP_arr[0] = 0
HP_arr
array([ 0, 110, 75, 50])
次は2次元配列
Numpy配列の作成
2次元の場合は、さらに[]で括ります。
2次元の場合
HP_arr = np.array([[120, 110, 75, 50]])
HP_arr
array([[120, 110, 75, 50]])
1次元の場合は縦とか横の概念がありませんが、2次元の場合は縦と横があります。上の例だと、120, 110, 75, 50が横方向に並んだものとなります。
つまり行(row)です。
縦に並べたい場合、つまり列(カラム、column)にしたい場合は、こう書きます。
HP_arr = np.array([[120], [110], [75], [50]])
HP_arr
array([[120],
[110],
[ 75],
[ 50]])
さて、冒頭で示したこの表のデータ(4行2列)をNumpyで書いてみましょう。

all_arr = np.array([[120, 0], [110, 30], [75, 65], [50, 80]])
all_arr
array([[120, 0],
[110, 30],
[ 75, 65],
[ 50, 80]])
エリアを絞る
行を取り出す
1行目を取り出す場合
all_arr[0]
array([120, 0])
2次元配列の形で取り出す場合はこうします。
all_arr[[0]]
array([[120, 0]])
行の範囲を指定して取り出すことも可能です。2次元配列の形で返ってきます。
all_arr[0:1]
array([[120, 0]])
行、列の両方を指定してもOKです。
all_arr[0:1, :]
array([[120, 0]])
列を取り出す
列を取り出すときは、先ほどの行、列の両方を指定する方法を使います。
all_arr[:, 0:1]
array([[120],
[110],
[ 75],
[ 50]])
行、列の両方を指定して取り出す
1行目&1列目
all_arr[0:1, 0:1]
array([[120]])
1〜3行目&1〜2列目
all_arr[0:3, 0:4]
array([[120, 0],
[110, 30],
[ 75, 65]])
こういう書き方もできます。行と列を別々の角カッコで示す方法です。
all_arr[0:1][0:1]
array([[120]])
all_arr[0][0]
120
all_arr[0:3][0:4]
array([[120, 0],
[110, 30],
[ 75, 65]])
Numpy配列のサイズを見る
shapeで確認できます。
all_arr.shape
(4, 2)
4行2列だと確認できました。
形を変える、転置する
2行4列に変えてみます。
all_arr.reshape(2,4)
array([[120, 0, 110, 30],
[ 75, 65, 50, 80]])
1行8列への変形もやってみます。
all_arr.reshape(1,8)
array([[120, 0, 110, 30, 75, 65, 50, 80]])
転置行列を作る(4行2列を2行4列に変形する)場合は.Tをつけます。
all_arr.T
array([[120, 0, 110, 30],
[ 75, 65, 50, 80]])
計算する
全データに対して計算
普通の数値計算と同じ書き方が使えます。
all_arr -1
array([[119, -1],
[109, 29],
[ 74, 64],
[ 49, 79]])
all_arr *2
array([[240, 0],
[220, 60],
[150, 130],
[100, 160]])
all_arr + all_arr
array([[240, 0],
[220, 60],
[150, 130],
[100, 160]])
こういう計算方法もあります。
平方根(ルート)
np.sqrt(all_arr)
array([[10.95445115, 0. ],
[10.48808848, 5.47722558],
[ 8.66025404, 8.06225775],
[ 7.07106781, 8.94427191]])
exp
np.exp(all_arr)
array([[1.30418088e+52, 1.00000000e+00],
[5.92097203e+47, 1.06864746e+13],
[3.73324200e+32, 1.69488924e+28],
[5.18470553e+21, 5.54062238e+34]])
絶対値
np.abs(all_arr)
array([[120, 0],
[110, 30],
[ 75, 65],
[ 50, 80]])
他にも、平均を出すnp.mean()、合計を出すnp.sum()、最大値を出すnp.max()、最大値のindexを出すnp.argmax()など、色々あります。
行、列ごとに計算
平均の計算を例に説明します。
まずは全体を計算する場合
np.mean(all_arr)
66.25
行ごとに計算する場合(横方向はaxis=1になります)
np.mean(all_arr, axis=1)
array([60., 70., 70., 65.])
列ごとに計算する場合(縦方向はaxis=0になります)
np.mean(all_arr, axis=0)
array([88.75, 43.75])
デフォルトがカラム方向(列方向)なのでaxis=0が列方向だと思っておけばよいかと思います。
最後に、全て値がゼロのNumpy配列を作る方法
np.zeros()で作成できます。
np.zeros((4,4))
array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])