このブログではデータサイエンスに関わる情報を発信しています。
今回はnumpyの使い方5回目という事で、平均値や中央値を求めたりする演算について解説します。
やっとデータ分析っぽくなってきましたね!楽しみつつ勉強していきましょう。
全てサンプルコードを記載してあります。各々のpythonの環境で実際に手を動かしながら読み進めていってください。
サクッとやりたい方は、google colaboratoryが簡単でおすすめです。
numpyの演算について

NumPyは、高速な数値演算を実行するためのPythonのライブラリで、科学計算、データ分析、機械学習などで広く使用されています。
NumPyを使うことで、多次元配列や行列演算を効率的に処理できます。
Numpyが扱う関数
また、NumPyには多くの数学関数が実装されており、以下の物を扱っています。
- 三角関数
- 指数関数
- 対数関数
- 絶対値関数
- 平方根
また、NumPyは配列の要素を一括で演算することもできます。
例えば、すべての要素の合計、平均、最大値、最小値などを一括で計算することができます。
さらに、配列同士の演算やスカラーとの演算も簡単に行えます。
NumPyの演算は、高速かつ効率的に行うことができるため、大規模なデータの処理に適しています。
NumPyの演算を使うことで、より効率的なコードを記述することができます。
ではそれぞれの関数を見ていきましょう。
max()とargmax()
まずは配列内の最大値を求めるmax()と最大値のインデックスを取得するargmax()について見ていきましょう。
max()で最大値を求める
max()関数は、配列内の最大値を取得するために使用されます。
NumPyでは、一次元配列に対して直接max()を適用することができます。
複数次元配列に対してmax()を適用する場合は、axis引数を指定して適用する次元を指定する必要があります。
1 2 3 4 5 6 7 8 9 10 |
import numpy as np # 一次元配列の場合 arr1 = np.array([1, 2, 3, 4, 5]) print(np.max(arr1)) # 5 # 二次元配列の場合 arr2 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print(np.max(arr2, axis=0)) # [7 8 9] print(np.max(arr2, axis=1)) # [3 6 9] |
上記の例では、一次元配列では最大値が5であることがわかり、二次元配列ではaxis=0を指定することで、各列の最大値が計算され、[7, 8, 9]という結果が得られています。
同様に、axis=1を指定することで各行の最大値が計算され、[3, 6, 9]という結果が得られます。
argmax()で最大値のインデックスを求める
argmax()は配列の中から最大値の要素のインデックスを取得するために使用されます。
例えば、以下のような配列があった場合、argmax()を使用して最大値を持つ要素のインデックスを取得することができます。
1 2 3 |
arr = np.array([3, 2, 7, 1, 4, 6]) max_index = np.argmax(arr) print(max_index) |
この場合、最大値である「7」の要素のインデックスである「2」が返されます。
また、多次元配列の場合は、引数に軸(axis)を指定することができます。
以下の例では、2次元配列の各行で最大値を持つ要素のインデックスを取得しています。
1 2 3 |
arr = np.array([[3, 2, 7], [1, 4, 6]]) max_index = np.argmax(arr, axis=1) print(max_index) |
この場合、出力は[2, 2]となります。
つまり、最大値を持つ要素のインデックスが2である2つの行があることを示しています。
axis=0にすると、出力が[0 1 0]となり、各列での最大値を持つ要素のインデックスを示しています。
argmax()は、機械学習やデータ分析の分野で特によく使用されます。例えば、分類問題において、予測された確率分布の中で最も高い確率を持つクラスを決定するために使用されます。
min()とargmin()
最大値とは逆に、最小値とそのインデックスを取得します。
使い方はmax()と同じ様にして使えます。
min()で最小値を求める
min()で一次元配列と二次元配列の場合の使い方です。
1 2 3 4 5 6 7 8 |
a = np.array([1, 3, 2]) min_a = np.min(a) print("aの最小値:", min_a) b = np.array([[1, 2, 3], [4, 0, 6]]) min_rows = np.min(b, axis=1) print("bの各行の最小値:", min_rows) |
出力結果は↓になります。
->
aの最小値: 1
bの各行の最小値: [1 0]
argmin()で最小値を求める
argmin()関数は、引数に渡された配列の中で最小値を持つ要素のインデックスを返します。
1 2 3 4 5 6 7 |
a = np.array([10, 20, 30, 40, 50]) index = np.argmin(a) print("aの最小値のインデックスは:", index) b = np.array([[5, 6, 3], [0, 4, 8]]) indexes = np.argmin(b, axis=1) print("bの各行の最小値のインデックスは:", indexes) |
出力結果は↓になります。
->
aの最小値のインデックスは: 0
bの各行の最小値のインデックスは: [2 0]
mean()で平均を求める

mean()関数は配列内の要素の平均値を計算するために使用されます。
具体的な使い方を見ていきましょう。
配列arrの平均値を計算する例です。
1 2 3 4 |
arr = np.array([1, 2, 3, 4, 5]) mean = np.mean(arr) print("arr の平均値は", mean, "です。") |
出力結果は↓になります。
->
arr の平均値は 3.0 です。
axis引数の使い方
mean()でもaxis引き数を取る事ができます。
axisを指定すると行・列を指定して平均値を計算することができます。
axis=1で行毎の平均値を見て見ましょう。
1 2 3 4 |
arr = np.array([[1, 2, 3], [4, 5, 6]]) mean = np.mean(arr, axis=1) print("arrの行毎の平均値は", mean, "です。") |
出力結果は↓になります。
->
arrの行毎の平均値は [2. 5.] です。
medianで中央値を求める
median()メソッドは、与えられた配列の中央値(中央値とは、データの中央に位置する値)を返します。
配列はnumpy.ndarray型である必要があります。
medianの使い方
1 2 3 |
a = np.array([1, 2, 3, 4, 5]) result = np.median(a) print(result) |
出力結果は↓になります。
->
3.0
また、多次元配列についても、.median()を用いることができます。
次の例は、2次元配列bに対して、列方向に中央値を計算する例です。
1 2 3 |
b = np.array([[1, 2], [3, 4], [5, 6]]) result = np.median(b, axis=0) print(result) |
出力結果は↓になります。
->
[3. 4.]
var()とmedian()
var()は、与えられた配列の分散を計算するためのNumPyの関数で、median()は標準偏差を計算します!
分散と標準偏差の英名は↓です。何かと使うので覚えておきましょう。
- 分散:variance
- 標準偏差:standard deviation
まず、分散を覚えていますか?統計学の基礎中の基礎ですね!
データのばらつき具合を示す指標の1つで、値が大きければデータがばらついてます。
下記の式で表す事ができました。
$\sigma^2 = \frac{1}{N} \sum_{i=1}^{N} (x_i – \mu)^2$
そして標準偏差は分散の平方根です。
$\sigma = \sqrt{\frac{1}{N} \sum_{i=1}^{N} (x_i – \mu)^2}$
では使い方を見ていきましょう。
var()、std()の使い方
使い方も今までと同じでシンプルです。
まずは分散を求めてみましょう。
1 2 3 |
data = np.array([1, 2, 3, 4, 5]) variance = np.var(data) print(variance) |
->2.0
簡単ですね!
続いて標準偏差です。
1 2 3 |
data = np.array([1, 2, 3, 4, 5]) std = np.std(data) print(std) |
->1.4142135623730951
sqrt()関数
ちなみに先ほどの分散のルートを取る事で標準偏差を求める事もできます。
その際にsqrt()関数を使います。
1 2 3 |
data = np.array([1, 2, 3, 4, 5]) std = np.sqrt(np.var(data)) print(std) |
->1.4142135623730951
std()を使った結果と同じになりました!
複数配列の場合
もちろん複数配列の場合でも使う事ができます。
同じくaxis引数に列か行を指定するだけです。
3×3行列の行毎の分散を求めてみましょう。
1 2 3 |
data = np.array([[1, 5, 3], [3, 4, 3], [1, 5, 9]]) result = np.var(data, axis=1) print(result) |
->[ 2.66666667 0.22222222 10.66666667]
exp()で指数関数
exp()は与えられた値の指数関数(exponential function)を計算します。
数式で表現すると、以下のようになります。
$y = e^x$
ここで、$e$は自然対数の底であり、おおよそ $2.718$ という値になります。$x$は指数部分にあたり、任意の実数が入力されることができます。
expの使い方
1 2 3 4 |
x = 2 y = np.exp(x) print(y) # 結果: 7.38905609893065 |
->7.38905609893065
このように使います。
もちろん今まで通り、引数にリストやndarrayを渡す事もできます。
1 2 3 4 |
x = np.array([1, 2, 3]) y = np.exp(x) print(y) |
->[ 2.71828183 7.3890561 20.08553692]
log()とは?
log()は、対数を計算するNumPyの関数であり、指定された底に対する対数を返します。
通常、eを底とする自然対数、すなわちln(x)を計算することが一般的ですが、底を変更することもできます。
log()関数の基本的な構文は以下の通りです。
np.log(x, base)
ここで、xは数値または配列であり、baseは対数の底を表します。
baseのデフォルト値はeであり、底を指定しない場合は自然対数が計算されます。
例えば、以下のようなコードを使用して、対数を計算することができます。
1 2 3 4 5 6 7 |
# 対数を計算するための値を定義 x = 10 # 対数の計算 result = np.log(x) print(result) |
->2.302585092994046
このコードでは、xの自然対数(底eの対数)が計算され、結果として2.30258509が出力されます。
log()関数は、データ分析や機械学習などの分野で広く使用されています。
例えば、データが右に偏った分布を持つ場合、データの対数変換を行うことで正規分布に近似させることができます。
また、機械学習モデルの評価指標として、対数誤差(log loss)が使用されることもあります。
まとめ
いかがでしたでしょうか?
かなりボリューミーな内容だったので、大変だったと思います。
今回学んだ関数をまとめると、↓のように多かったですね!
- max()/argmax()
- min()/argmin()
- mean()
- median()
- var()/std()
- exp()
- log()
これを今すぐに完璧に覚える必要はありません。
出来る事を理解しておき、実務で使う際に「そういえばあの関数が使えそうだな」っと振り返る事が出来れば十分です。
Work illustrations by Storyset