概要
numpy により始点の値 start と公差 step と要素数 num から等差数列を生成するには、下記のようにするとスマート。
array = start + np.arange(num) * step
numpy の等差数列を生成する関数
numpy には等差数列を生成する関数として、numpy.arange と numpy.linspace がある。
numpy.arange は、始点の値 start、終点の値 stop、公差 step を指定する。
numpy.linspace は、始点の値 start、終点の値 stop、要素数 num を指定する。
こうくると、始点の値、公差、要素数を指定して等差数列を生成する関数もありそうだが、記事投稿時のバージョン1.22ではこれに対応する関数はない。
始点の値、公差、要素数による等差数列の生成
始点の値 start、公差 step、要素数 num を指定して等差数列を生成する場合は、次のようにするとスマートである。
array = start + np.arange(num) * step
等差数列が 0 始まりであれば start を省略し、下記でもよい。
array = np.arange(num) * step
この方法により等差数列を生成する例を示す。
import numpy as np
start = 1.0
step = 0.1
num = 6
array1 = start + np.arange(num) * step
print(array1)
[1. 1.1 1.2 1.3 1.4 1.5]
他の方法との比較
上記の方法ではなく、終点の値 stop を計算して numpy.arange や numpy.linspace の引数に与える方法も考えられる。しかし、バグ予防や保守性の観点では、start + np.arange(num) * step の方法が優れている。
numpy.arange に stop を与える場合
numpy.arange の stop に実数を与えると、実数の計算誤差により意図した配列が得られないことがある。引数の値の組み合わせ次第では正しく計算されるが、バグの元になるため避けたほうがよい。
意図しない動作になっている例を示す。
import numpy as np
start = 1.0
step = 0.1
num = 6
array2 = np.arange(start, start + step * num, step)
print(array2)
[1. 1.1 1.2 1.3 1.4 1.5 1.6]
要素数が7個になってしまっており、望ましい結果ではない。
numpy.linspace に stop を与える場合
numpy.linspace の場合、numpy.arange のような実数誤差によるバグは生じないため、こちらを使っても問題ない。 1
しかし、今回のような公差と要素数から等差数列を生成する場合に numpy.linspace を使うと次のようになる。
array3 = np.linspace(start, start + step * num, num, endpoint=False)
同じ変数が何度も出てきたり、endpoint 引数による最後の要素の扱いについて混乱しやすいなど、保守性が低下する恐れがある。
参考文献
-
numpy.linspaceで生成した配列中の要素に実数計算の誤差が含まれる可能性はある。この記事で紹介しているstart + np.arange(num) * stepでも誤差は発生するが、誤差の出方は異なる場合がある。そのため、この2つの方法で全く同じ配列が得られるとは限らない。 ↩