とらりもんHOME  Index  Search  Changes  Login

python入門: 数列の和

numpyモジュールのndarrayを使うと, forループなどを使わなくても繰り返し的な処理ができる

たとえば, 1から10までの整数の和を求めてみよう。普通にforループを使うならこうだ:

x=0
for i in range(1,11):
  x=x+i
print(x)

しかし, numpyを使えばもっと簡単にできる。まず, numpyをインポートする:

import numpy as np

次に, 1から10までの整数を格納したnumpy.ndarrayインスタンスを作る。それにはこうするのだ:

np.arange(1,11)

すると, array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])と出てくるだろう。np.arange()は前回for文を学んだ時に出てきたrange()と似ていて, 最初と最後(+1)の値を指定すると, 連続する数値をずらっと並べてくれる。この和を求めるにはこうすればよい:

np.arange(1,11).sum()

すると55と出てくる。この.sum()は, numpy.ndarrayのメソッドのひとつであり, 要素を全部たして結果を返す, という操作をしてくれる。ちなみにこの処理は,

np.array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]).sum()

と同じだということはわかるだろうか?

では, 1から10までの各整数の2乗の和を求めるにはどうすればよいだろう? まず, 「1から10までの各整数の2乗」は,

np.arange(1,11)**2

でできるはずだ(やってみよう)。そして, その和は,

(np.arange(1,11)**2).sum()

とやれば求まるはずだ。

課題: この答を, 高校数学で学んだ例の公式: n(n+1)(2n+1)/6の計算結果と比べてみよう。合っているだろうか?

では, これを応用して, 1からnまでの整数の2乗の逆数の和, つまり

1/(1^2)+1/(2^2)+...+1/(n^2)

を求めよう。既に諸君はこれは(π^2)/6=1.644934...に近づくことを知っている(nが十分に大きいとき)。例として, n=1000でやってみよう:

(1/(np.arange(1,1001)**2)).sum()

結果は1.6439...である。それなりに近いではないか。

課題: これを, 1000までだけでなく, 10000まで, 1000000までのそれぞれで試してみよ。

さて, この式を利用して, πの近似計算をやってみよう。

1/(1^2)+1/(2^2)+...+1/(n^2)≒(π^2)/6

なので,

π≒√(6*(1/(1^2)+1/(2^2)+...+1/(n^2))

となるはず(ルートは右辺の全体にかかる)。というわけで,

np.sqrt((6/(np.arange(1,1001)**2)).sum())

とすればよい(n=1000のとき)。3.14に近い数が出てくるだろう。

課題: これを, 1000までだけでなく, 10000まで, 1000000までのそれぞれで試してみよ。

Last modified:2019/01/31 06:20:53
Keyword(s):
References:[python入門]