Pythonで連番を生成するためには、range関数をよく使用します。例えば、以下のように使用すると、0..9の値を生成するジェネレータを返すので、リスト内包と一緒に使うことで0..9の要素を含むリストが作られます。

>> [x for x in range(10)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

このような連番要素を含むndarrayを生成しようとしたときに、Pythonのrangeを使用して以下のようにすることもできます。

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

もっと簡単かつ高速に生成するために、NumPyには連番や等差数列の要素を含むndarrayを生成するための関数np.arangeがあります。本記事では、np.arangeの使用方法を見ていきます。

等差数列

np.arange関数の使い方の解説に入る前に、この関数によって生成される数列である等差数列について簡単におさらいしておきましょう。

等差数列は、項の間における値の差が一定である数列のことを指します。 初項はその最初の項、等差は項間の差になります。例えば初項5、等差2の等差数列は次のようになります。

5, 7, 9, 11, 13, 15.....

np.arange

np.arangeは、連番や等差数列を生成する関数です。 同様の関数としてlinspaceがありますが、指定できる要素が異なるのとarangeは1つだけ引数を設定するだけで手軽に数列を生成できる違いがあります。 APIドキュメントは以下のようになっています。

numpy.arange([start, ]stop, [step, ]dtype = None)

params:

パラメータ名 概要
start intまたはfloat (省略可能)初期値0
生成する等差数列の最初の項を設定します。これを指定しないと0から始まる等差数列が生成されます。
stop intまたはfloat 生成する等差数列の終点を指定します。
step intまたはfloat (省略可能) 初期値1
生成される数列の1つ1つの項間における差を指定します。(公差)
dtype dtype (省略可能)初期値None
生成される数列のデータ型を指定します。これを指定しないとstartやstopで入力したデータ型がそのまま適用されます。

returns:

指定された等差(初期値は1)を持つ等差数列を要素とするndarrayが返されます。

arangeの引数では、第一引数で生成したい数列の初項(初期値0)、第二引数で終点、第三引数で等差(初期値1)、第四引数でデータ型を指定します。
また、第二以外は省略ができますが、第三引数である等差を指定するときは同時に第一引数である初項も設定する必要があります。

ある終点だけを指定した場合

まずは第二引数である終点だけを指定しただけの場合をみます。0からの連番を生成する際に太陽されるため、この形で使用されることが最も多くなっています。 このときは初項が0で公差が1の等差数列を要素とするndarrayが返されます。

In [1]: import numpy as np

In [2]: np.arange(5) # 0~5の等差数列(ただし引数として指定した5は数列の範囲に含まれない)
Out[2]: array([0, 1, 2, 3, 4])

In [3]: np.arange(-10) # 負の値を指定すると要素を持たない配列が返される。
Out[3]: array([], dtype=int64)

In [4]: np.arange(4.5) # floatの形式でも配列は生成される。
Out[4]: array([ 0.,  1.,  2.,  3.,  4.])

次に初項も指定してみます。等差を指定しないので等差は相変わらず1のままです。

In [5]: np.arange(1, 8)
Out[5]: array([1, 2, 3, 4, 5, 6, 7])

In [6]: np.arange(2, 10)
Out[6]: array([2, 3, 4, 5, 6, 7, 8, 9])

In [7]: np.arange(0.5, 5.5) # 小数点以下まで設定しても配列は生成される。
Out[7]: array([ 0.5,  1.5,  2.5,  3.5,  4.5])

In [8]: np.arange(0.55, 5.55)
Out[8]: array([ 0.55,  1.55,  2.55,  3.55,  4.55])

公差を指定する

公差を指定してみます。公差を指定する場合は初項も指定する必要があります。
公差は整数でなくても配列は生成されます。

In [9]: np.arange(2, 12, 2) # 初項2,公差2で終点が12の等差数列
Out[9]: array([ 2,  4,  6,  8, 10])

In [10]: np.arange(2, 5, 0.2) # 公差は整数でなくともよい。
Out[10]:
array([ 2. ,  2.2,  2.4,  2.6,  2.8,  3. ,  3.2,  3.4,  3.6,  3.8,  4. ,
        4.2,  4.4,  4.6,  4.8])

In [11]: np.arange(5, 2, -1) # 公差は負の値を指定することができる。
Out[11]: array([5, 4, 3])


In [12]: np.arange(stop = 3, step = 1) # startを指定しないとエラーが返ってくる。
---------------------------------------------------------------------------
( エラーメッセージが表示される)

TypeError: Required argument 'start' (pos 1) not found

データ型を指定した場合

最後にデータ型を指定してみます。

dtypeにデータ型を代入すればよいですが、このdtypeをintに指定すると等差の小数点以下の部分が切り捨てられます。また、初項や終点で入れた値のデータ型には左右されなくなります。

In [13]: np.arange(5, dtype = 'float64') # 浮動小数に変換。
Out[13]: array([ 0.,  1.,  2.,  3.,  4.])

In [14]: np.arange(5.0, dtype = 'int') # 整数に変換。
Out[14]: array([0, 1, 2, 3, 4])

In [15]: np.arange(0, 5, 0.5, dtype = 'int') # 等差にキリが悪いものを持ってくると切り捨てされる。
Out[15]: array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

In [16]: np.arange(0, 5, 1.5, dtype = 'int') # 等差にキリが悪いものを持ってくると切り捨てされる。
Out[16]: array([0, 1, 2, 3])