【NumPy入門 np.linspace】等差数列を作成する関数

こんにちは!インストラクターのフクロウです。

この記事では、等差数列を作るための関数、np.linspaceを紹介します。同じような目的で使うNumPyの関数に、np.arangeがありますね。こちらは数列のstep幅を指定しましたが、np.linspaceでは要素数を指定する点が異なります。

どちらも非常に便利な関数なので、この記事で是非使い方を覚えてくださいね!

目次

np.linspaceの引数と返り値

参考:SciPy.org

numpy.linspace(startstopnum=50endpoint=Trueretstep=Falsedtype=None)

startとstopで指定された区間で、numで指定された要素の等差数列を返します。

Parameters:
start : scalar(数字)

シーケンスの最初の値

stop : scalar

シーケンスの最後の値

num : int, optional

生成するサンプル数、デフォルトは50個になっています。

endpoint : bool, optional

Trueならばstopが最後の値になります。

Falseならばstopの値は数列に含まれません。

デフォルトではTrueです。

retstep : bool, optional

Trueならばstep数も一緒に返されます。返り値の例:(sample, step)

デフォルトではFalseです。

dtype : dtype, optional

出力配列の型を指定できます。

Returns:
samples : ndarray

等差数列を格納した配列を返します。

step : float, optional

restepがTrueの場合だけ返されます。

step幅が返されます。

使い方

以降のコードはJupyterで実行してみてください。

まずはNumPyをimportします。

また、結果の可視化のためにmatplotlibも用意しましょう。

In [1]:
import numpy as np 
import matplotlib.pyplot as plt

基本的な使い方

最も簡単なnp.linspaceの使い方は、startとstop(開始点と終了点)を指定するだけです。

In [2]:

Y = np.linspace(0, 100)

In [3]:

def array_info(Y):
    print("配列のshape", Y.shape)
    print("配列の要素のデータ型", Y.dtype)
    print("配列の中身n",Y)
    X = np.arange(len(Y))
    plt.figure(figsize=(15,5)) 
    plt.title("linspace result")
    plt.scatter(X,Y)

In [4]:

array_info(Y)

Out:

配列のshape (50,)
配列の要素のデータ型 float64
配列の中身
 [  0.           2.04081633   4.08163265   6.12244898   8.16326531
  10.20408163  12.24489796  14.28571429  16.32653061  18.36734694
  20.40816327  22.44897959  24.48979592  26.53061224  28.57142857
  30.6122449   32.65306122  34.69387755  36.73469388  38.7755102
  40.81632653  42.85714286  44.89795918  46.93877551  48.97959184
  51.02040816  53.06122449  55.10204082  57.14285714  59.18367347
  61.2244898   63.26530612  65.30612245  67.34693878  69.3877551
  71.42857143  73.46938776  75.51020408  77.55102041  79.59183673
  81.63265306  83.67346939  85.71428571  87.75510204  89.79591837
  91.83673469  93.87755102  95.91836735  97.95918367 100.        ]

第三引数で要素数を変える

要素数を変えるには、第三引数numに値を指定します。

In [5]:
Y2 = np.linspace(0, 100, 20)
array_info(Y2)

Out:

配列のshape (20,)
配列の要素のデータ型 float64
配列の中身
 [  0.           5.26315789  10.52631579  15.78947368  21.05263158
  26.31578947  31.57894737  36.84210526  42.10526316  47.36842105
  52.63157895  57.89473684  63.15789474  68.42105263  73.68421053
  78.94736842  84.21052632  89.47368421  94.73684211 100.        ]

これまでは昇順の数列でしたが、降順にもできます。

第一引数と第二引数の値をstart>endstart>endとするだけでOKです。

In [6]:
Y3 = np.linspace(0,-10, 20) 
array_info(Y3)
Out:
配列のshape (20,)
配列の要素のデータ型 float64
配列の中身
 [  0.          -0.52631579  -1.05263158  -1.57894737  -2.10526316
  -2.63157895  -3.15789474  -3.68421053  -4.21052632  -4.73684211
  -5.26315789  -5.78947368  -6.31578947  -6.84210526  -7.36842105
  -7.89473684  -8.42105263  -8.94736842  -9.47368421 -10.        ]

endpointを使って[start, end)な数列を作る

endpointをFalseにした場合、endは必ずしも数列に含まれません。完璧な等差数列を作りたい場合はおすすめです。

In [7]:
Y4 = np.linspace(10,50,33, endpoint=False)
array_info(Y4)
Out:
配列のshape (33,)
配列の要素のデータ型 float64
配列の中身
 [10.         11.21212121 12.42424242 13.63636364 14.84848485 16.06060606
 17.27272727 18.48484848 19.6969697  20.90909091 22.12121212 23.33333333
 24.54545455 25.75757576 26.96969697 28.18181818 29.39393939 30.60606061
 31.81818182 33.03030303 34.24242424 35.45454545 36.66666667 37.87878788
 39.09090909 40.3030303  41.51515152 42.72727273 43.93939394 45.15151515
 46.36363636 47.57575758 48.78787879]

retstepを使って数列のstep幅を取得

retstepをTrueにすると、np.linspaceの返り値の形が変わります。数列とstep幅をまとめたtuple型が返ってきます。step幅を確認することができるので使ってみましょう。

In [8]:
result = np.linspace(0, -50, 7, endpoint=False, retstep=True)
result
Out[8]:
(array([  0.        ,  -7.14285714, -14.28571429, -21.42857143,
        -28.57142857, -35.71428571, -42.85714286]), -7.142857142857143)
In [9]:
Y5, step5 = result 
array_info(Y5) 
print("step幅:",step5)
Out:
配列のshape (7,)
配列の要素のデータ型 float64
配列の中身
 [  0.          -7.14285714 -14.28571429 -21.42857143 -28.57142857
 -35.71428571 -42.85714286]
step幅: -7.142857142857143

まとめ

この記事では、等差数列が作れるNumPyの関数、np.linspaceを紹介しました。np.arangeと同じように、等差数列がほしいタイミングで活躍する関数です。

要素数を指定できる点、末尾の値を優先するか等間隔であることを優先するかを選べる汎用性の高さなど、様々な要求に答えてくれる関数ですね。

是非使いこなして、科学計算や機械学習の実装で役立ててください。今回の記事は下記の記事を参考にしています。
参考記事:

この記事を書いた人

第一言語はPythonです。
皆さんRustやりましょう。

目次