numpy
前回、【Python基礎】ファイルのソートで順番がおかしい時に確認すること、試すことを紹介しました。
今回はnumpyで二次元リスト、三次元リストにおける合計値、平均値、標準偏差、分散値を解説していきます。
numpyの計算に関してはこちらの記事でも紹介していますので、よかったらどうぞ。
この時と今回の違いですが、この記事では一次元リストの計算でした。
今回は二次元リスト、三次元リストにおいて軸を指定することで例えば縦方向だったり、横方向だったり、もしくは高さ方向だったりと特定の軸方向の計算をしていく方向を解説していきます。
まずはおさらい。
numpyにおける計算は合計値は「np.sum(リスト)」、平均値は「np.mean(リスト)」もしくは「np.average(リスト)」、標準偏差は「np.std(リスト)」、分散値は「np.var(リスト)」でした。
import numpy as np
data = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
print(np.sum(data))
print(np.mean(data))
print(np.std(data))
print(np.var(data))
実行結果
45
5.0
2.581988897471611
6.666666666666667
これを今回は二次元リスト、三次元リストに拡張していきましょう。
二次元リストの計算
まずは二次元リストから試していきましょう。
とりあえず二次元リストを作成し、先ほどの一次元リストと同じ計算をしてみます。
import numpy as np
data = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
print(np.sum(data))
print(np.mean(data))
print(np.std(data))
print(np.var(data))
実行結果
45
5.0
2.581988897471611
6.666666666666667
計算対象が二次元リストに変わったのにも関わらず、全ての要素に対しての計算結果となりました。
二次元リストで特定の軸方向に対して計算を行う場合は「axis=軸方向」のオプションを追加します。
また軸方向は「0」、「1」といった数値で指定します。
「axis=0」を試してみるとこんな感じです。
import numpy as np
data = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
print(np.sum(data, axis=0))
print(np.mean(data, axis=0))
print(np.std(data, axis=0))
print(np.var(data, axis=0))
実行結果
[12 15 18]
[4. 5. 6.]
[2.44948974 2.44948974 2.44948974]
[6. 6. 6.]
「axis=0」の場合、各リストの同じインデックスの要素同士(縦方向)で計算されます。
つまり「1, 4, 7」、「2, 5, 8」、「3, 6, 9」でそれぞれ計算されるということです。
次に「axis=1」を試してみましょう。
import numpy as np
data = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
print(np.sum(data, axis=1))
print(np.mean(data, axis=1))
print(np.std(data, axis=1))
print(np.var(data, axis=1))
実行結果
[ 6 15 24]
[2. 5. 8.]
[0.81649658 0.81649658 0.81649658]
[0.66666667 0.66666667 0.66666667]
「axis=1」の場合、各リストごと(横方向)、つまり「1, 2, 3」、「4, 5, 6」、「7, 8, 9」で計算されます。
三次元リストの計算
次に三次元リストの計算を試してみましょう。
こちらも最初は軸を指定せずに計算をしてみます。
import numpy as np
data = np.array([[[1, 2, 3],[4, 5, 6],[7, 8, 9]],
[[1, 2, 3],[4, 5, 6],[7, 8, 9]],
[[1, 2, 3],[4, 5, 6],[7, 8, 9]]])
print(np.sum(data))
print(np.mean(data))
print(np.std(data))
print(np.var(data))
実行結果
135
5.0
2.581988897471611
6.666666666666667
軸を指定しない場合、やはりリスト内の全ての要素に対する計算結果が返されます。
次に「axis=0」を試してみましょう。
import numpy as np
data = np.array([[[1, 2, 3],[4, 5, 6],[7, 8, 9]],
[[1, 2, 3],[4, 5, 6],[7, 8, 9]],
[[1, 2, 3],[4, 5, 6],[7, 8, 9]]])
print(np.sum(data, axis=0))
print(np.mean(data, axis=0))
print(np.std(data, axis=0))
print(np.var(data, axis=0))
実行結果
[[ 3 6 9]
[12 15 18]
[21 24 27]]
[[1. 2. 3.]
[4. 5. 6.]
[7. 8. 9.]]
[[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]]
[[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]]
「axis=0」のオプションを追加して計算してみると、二次元リスト毎([[1, 2, 3],[4, 5, 6],[7, 8, 9]])の三次元目のリストの同じインデックスの要素(「1, 1, 1」、「2, 2, 2」、「3, 3, 3」)に対しての計算がされました。
「axis=1」を試してみましょう。
import numpy as np
data = np.array([[[1, 2, 3],[4, 5, 6],[7, 8, 9]],
[[1, 2, 3],[4, 5, 6],[7, 8, 9]],
[[1, 2, 3],[4, 5, 6],[7, 8, 9]]])
print(np.sum(data, axis=1))
print(np.mean(data, axis=1))
print(np.std(data, axis=1))
print(np.var(data, axis=1))
実行結果
[[12 15 18]
[12 15 18]
[12 15 18]]
[[4. 5. 6.]
[4. 5. 6.]
[4. 5. 6.]]
[[2.44948974 2.44948974 2.44948974]
[2.44948974 2.44948974 2.44948974]
[2.44948974 2.44948974 2.44948974]]
[[6. 6. 6.]
[6. 6. 6.]
[6. 6. 6.]]
「axis=1」とすると二次元リスト内のリストの三次元目のリストの同じインデックスの要素(「1, 4, 7」、「2, 5, 8」、「3, 6, 9」)に対して計算が行われました。
三次元リストなのでもう一つ軸があるので、今度は「axis=2」と指定してみましょう。
import numpy as np
data = np.array([[[1, 2, 3],[4, 5, 6],[7, 8, 9]],
[[1, 2, 3],[4, 5, 6],[7, 8, 9]],
[[1, 2, 3],[4, 5, 6],[7, 8, 9]]])
print(np.sum(data, axis=2))
print(np.mean(data, axis=2))
print(np.std(data, axis=2))
print(np.var(data, axis=2))
実行結果
[[ 6 15 24]
[ 6 15 24]
[ 6 15 24]]
[[2. 5. 8.]
[2. 5. 8.]
[2. 5. 8.]]
[[0.81649658 0.81649658 0.81649658]
[0.81649658 0.81649658 0.81649658]
[0.81649658 0.81649658 0.81649658]]
[[0.66666667 0.66666667 0.66666667]
[0.66666667 0.66666667 0.66666667]
[0.66666667 0.66666667 0.66666667]]
「axis=2」を指定すると三次元目のリスト([1, 2, 3]、「4, 5, 6」、「7, 8, 9」)に対して計算が行われました。
Pandasだと二次元の方向(縦横)までなので、三次元リストでも計算ができるのは便利だなと思います。
次回はIPythonモジュールのclear_outputを使って出力をクリアする方法を紹介します。
ではでは今回はこんな感じで。
コメント