Python、機械学習

【Python】Numpyの基本的な操作方法(配列を作る、エリアを指定する、計算する)

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.]])