概要
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つの方法で全く同じ配列が得られるとは限らない。 ↩