Programmierkurs
für Naturwissenschaftler/innen

「配列」の練習問題の略解

数学的基礎

$n$ 個のデーター $x_1$, $x_2$, …, $x_n$ に対し、この平均を $\bar{x}$ と書くとき、 \[ \bar{x} = \frac{1}{n}\sum_{i = 1}^n x_i \] であり、分散 $\sigma^2$ は、 \[ \begin{align*} \sigma^2 & = \frac{1}{n} \sum_{i=1}^n \left(x_i - \bar{x} \right)^2 \\ & = \frac{1}{n} \sum_{i=1}^n x_i^2 - \left(\frac{1}{n} \sum_{i=1}^n x_i\right)^2 \\ & = \overline{x^2} - \bar{x}^2 \end{align*} \] である。

平均を求める関数

概ね以下のようになるであろう。

プログラム例 1

def average(array):
    ave = 0        # 初期化を忘れないこと
    for data in array:
        ave += data

    # 以下はまとめて return ave / len(array) とも書ける
    ave /= len(array)
    return ave

プログラム例 2

次も間違いではない。

def average(array):
    ave = 0
    for i in range(len(array)):
        ave += array[i]

    # 以下はまとめて return ave / len(array) とも書ける
    ave /= len(array)
    return ave

注意点

  • 変数の初期化を忘れないこと

  • 配列の要素数は len() で取得できる

  • 最後の二行はまとめて return ave / len(array) と書くこともできる。 ただしこの場合、 ave が実際の意味と異なる (実際には最終的な ave には平均を n 倍したものが入っている) ので、変数名を ave から n_ave (平均の $n$ 倍、の意) などに変えた方がよい

二つ目のプログラムの場合は、次の点にも注意のこと

  • 配列の添字は 0 から始まる点に注意せよ

  • for ではループ条件に細心の注意を払うこと

分散を求める関数

どの式を使うかによって多少違いは出るが、概ね以下のような感じであろう。

def variance(array):
    var = 0
    ave = average(array)

    for data in array:
        var += (data - ave) * (data - ave)

    var /= len(array)
    return var

注意点

  • 二乗の部分は (data - ave) ** 2 と書いてもよい

検算

問題に指示されたデーターを使って、平均、分散を表示するには、例えば以下のように書ける。

data = [71, 80, 89]
print(average(data), variance(data))

このとき、

80.0 54.0

のように表示されるはずである。