LoginSignup
0
0

More than 1 year has passed since last update.

numpyで公差と要素数から等差数列を生成する

Last updated at Posted at 2022-05-14

概要

numpy により始点の値 start と公差 step と要素数 num から等差数列を生成するには、下記のようにするとスマート。

array = start + np.arange(num) * step

numpy の等差数列を生成する関数

numpy には等差数列を生成する関数として、numpy.arangenumpy.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.arangenumpy.linspace の引数に与える方法も考えられる。しかし、バグ予防や保守性の観点では、start + np.arange(num) * step の方法が優れている。

numpy.arangestop を与える場合

numpy.arangestop に実数を与えると、実数の計算誤差により意図した配列が得られないことがある。引数の値の組み合わせ次第では正しく計算されるが、バグの元になるため避けたほうがよい。

意図しない動作になっている例を示す。

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.linspacestop を与える場合

numpy.linspace の場合、numpy.arange のような実数誤差によるバグは生じないため、こちらを使っても問題ない。 1
しかし、今回のような公差と要素数から等差数列を生成する場合に numpy.linspace を使うと次のようになる。

array3 = np.linspace(start, start + step * num, num, endpoint=False)

同じ変数が何度も出てきたり、endpoint 引数による最後の要素の扱いについて混乱しやすいなど、保守性が低下する恐れがある。

参考文献

  1. numpy.linspace で生成した配列中の要素に実数計算の誤差が含まれる可能性はある。この記事で紹介している start + np.arange(num) * step でも誤差は発生するが、誤差の出方は異なる場合がある。そのため、この2つの方法で全く同じ配列が得られるとは限らない。

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0