NumPyのnp.linspaceは、線形に等間隔な数列を生成する関数です。同様の数列をnp.arangeで生成することもできますが、np.linspaceを使用したほうがコード量を減らすことができ、読みやすくスマートになります。

等差数列

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

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

np.linspace

今回扱うnp.linspaceですが、上述した等差数列を生成する関数です。同様の関数としてnp.arangeがありますが、指定できる引数が異なります。np.linspaceを使用すると、指定した区間をN等分した数列を生成するためのコードだということが明確になり、読みやすくなるので等間隔の数列を生成する場合はこちらを使用しましょう。

np.arangeについては以下のページで取り扱っていますので参照してください。

連番や等差数列を生成するnumpy.arange関数の使い方 /features/numpy-arange.html

np.linspace関数のAPIドキュメントは以下のようになっています。

numpy.linspace(start, stop, num = 50, endpoint = True, retstep = False, dtype = None)

params:

パラメータ名 概要
start intまたはfloat 数列の始点を指定します。
stop intまたはfloat 数列の終点を指定します。
num int (省略可能)初期値50
生成する配列(ndarray)の要素数を指定します。
endpoint bool (省略可能)初期値True
生成する数列において、stopを要素に含むかどうか指定します。Trueなら含み、Falseなら含みません。
retstep bool (省略可能)初期値False
生成された配列(ndarray)の後に公差を表示するかどうか指定します。Trueなら表示し、Falseなら非表示です。
dtype dtype (省略可能)初期値None
出力された配列(ndarray)のデータ型を指定します。dtypeが指定されない場合、データ型は基本的にはfloatになっている。

returns:

num等分された等差数列を要素とするndarrayが返されます。

linspaceは、第一、第二引数で生成する等差数列の始点と終点とを指定します。第三引数であるnumで配列の長さを指定し、第四引数となっているendpointで終点を配列の要素として含むかどうかを指定します。残りのretstepは公差の表示の有無、dtypeではデータ型を指定できます。

引数の多い関数となっていますが、普段使う上ではstartstopnumの3つさえ押さえておけばあまり不自由はしないでしょう。

endpoint = Trueのときは、公差は \frac{stop - start}{num + 1} \\\\ で求められます。
一方、endpoint = Falseのときは、 \frac{stop - start}{num} \\\\ で求めることができます。

まずはstartstopnumだけいじってみます。

In [1]: import numpy as np

In [2]: np.linspace(0, 1) # まずは始点を0、終点を1に設定。
Out[2]:
array([ 0.        ,  0.02040816,  0.04081633,  0.06122449,  0.08163265,
        0.10204082,  0.12244898,  0.14285714,  0.16326531,  0.18367347,
        0.20408163,  0.2244898 ,  0.24489796,  0.26530612,  0.28571429,
        0.30612245,  0.32653061,  0.34693878,  0.36734694,  0.3877551 ,
        0.40816327,  0.42857143,  0.44897959,  0.46938776,  0.48979592,
        0.51020408,  0.53061224,  0.55102041,  0.57142857,  0.59183673,
        0.6122449 ,  0.63265306,  0.65306122,  0.67346939,  0.69387755,
        0.71428571,  0.73469388,  0.75510204,  0.7755102 ,  0.79591837,
        0.81632653,  0.83673469,  0.85714286,  0.87755102,  0.89795918,
        0.91836735,  0.93877551,  0.95918367,  0.97959184,  1.        ])

In [3]: np.linspace(0, 49) # 50個の要素が生成されることに注意して、幅を1に調整。
Out[3]:
array([  0.,   1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.,  10.,
        11.,  12.,  13.,  14.,  15.,  16.,  17.,  18.,  19.,  20.,  21.,
        22.,  23.,  24.,  25.,  26.,  27.,  28.,  29.,  30.,  31.,  32.,
        33.,  34.,  35.,  36.,  37.,  38.,  39.,  40.,  41.,  42.,  43.,
        44.,  45.,  46.,  47.,  48.,  49.])

In [4]: np.linspace(0, 2, 3) # 0~2の区間を3等分
Out[4]: array([ 0.,  1.,  2.])

In [5]: np.linspace(0, -2, 3) #負の値でも生成可能。
Out[5]: array([ 0., -1., -2.])

In [6]: np.linspace(0, 2, num = 3) # num = 3 のように指定することもできる。
Out[6]: array([ 0.,  1.,  2.])

 

次にendpointをいじってみます。

In [7]: np.linspace(0, 2, num = 3, endpoint = False) # 2を要素に含まない配列(ndarray)を返します。
Out[7]: array([ 0.        ,  0.66666667,  1.33333333])

In [8]: np.linspace(0, 2, num = 3, endpoint = True) # 2を要素に含む配列(ndarray)を返します。これがデフォルトです。
Out[8]: array([ 0.,  1.,  2.])

retstepを指定してみます。公差の表示の有無が切り替わります。

In [9]: np.linspace(0, 1, retstep = True) # 公差の表示を有りにする。
Out[9]:
(array([ 0.        ,  0.02040816,  0.04081633,  0.06122449,  0.08163265,
         0.10204082,  0.12244898,  0.14285714,  0.16326531,  0.18367347,
         0.20408163,  0.2244898 ,  0.24489796,  0.26530612,  0.28571429,
         0.30612245,  0.32653061,  0.34693878,  0.36734694,  0.3877551 ,
         0.40816327,  0.42857143,  0.44897959,  0.46938776,  0.48979592,
         0.51020408,  0.53061224,  0.55102041,  0.57142857,  0.59183673,
         0.6122449 ,  0.63265306,  0.65306122,  0.67346939,  0.69387755,
         0.71428571,  0.73469388,  0.75510204,  0.7755102 ,  0.79591837,
         0.81632653,  0.83673469,  0.85714286,  0.87755102,  0.89795918,
         0.91836735,  0.93877551,  0.95918367,  0.97959184,  1.        ]),
 0.020408163265306121)

In [10]: np.linspace(0, 2, num = 3, retstep = True)
Out[10]: (array([ 0.,  1.,  2.]), 1.0)

In [11]: np.linspace(0, 2, num = 3, retstep = False) # 公差を非表示に(デフォルトの設定)。
Out[11]: array([ 0.,  1.,  2.])

最後にdtypeを指定してみます。データ型をfloat64以外に変えたいときにここの引数を設定してください。

In [12]: np.linspace(0, 2, num = 3) # 何もデータ型を指定しないと、floatの形になる。
Out[12]: array([ 0.,  1.,  2.])

In [13]: a = np.linspace(0, 1, 3)

In [14]: a.dtype # データ型を確認。
Out[14]: dtype('float64')

In [13]: np.linspace(0, 2, num = 3, dtype = 'int') # データ型を'int'に指定。
Out[13]: array([0, 1, 2])

In [14]: np.linspace(0, 1, num = 4, dtype = 'float32') # データ型を'float32'にすると32ビット浮動小数となる。
Out[14]: array([ 0.        ,  0.33333334,  0.66666669,  1.        ], dtype=float32)

In [15]: np.linspace(0, 1, num = 4, dtype = 'float64') # 64ビット浮動小数
Out[15]: array([ 0.        ,  0.33333333,  0.66666667,  1.        ])