YutaKa Notebook | Python徹底図解ブログ!

Python の文法やモジュール、Python関連のAPIについて画像・ソースコード付きで徹底解説!

【徹底図解】NumPy linspace | 等間隔の数列を作成する【サンプルコード】

numpyには、配列ndarrayを生成するための様々な関数があります。

等間隔の数列を生成する関数linspace()を紹介します。

配列ndarrayの基本はこちらをチェック!

linspace()の使い方

linspace()は、0, 0.1, 0.2, 0.3, …のような等間隔の数値配列を作成します。

引数で数列の

  • 始点start
  • 終点stop
  • 分割点の数num(デフォルト50

を指定することができます。

他にもオプション引数で、

  • endpoint:終点を含むかどうか(デフォルトTrue
  • retstepstepサイズを返すかどうか(デフォルトFalse

を指定できます。

以下では、基本的なlinspace()使用方法をサンプルコードつきで解説します。

linspace(start, stop) ⇒ startからstopまでを50分割

startからstopまでを50分割した数列を作成します。

stopも含まれる点に注意してください。

x = np.linspace(0, 10)
# x → array([ 0.        ,  0.20408163,  …略…,  9.79591837, 10.        ])
# x.size → 50

なぜ50分割かというと、分割点数numのデフォルト値が50のためです。

これはちょっとしたグラフを書くときに便利です

例えば、次のようにすれば簡単に二次曲線が描けますね。

x = np.linspace(-2, 2)
y = x**2
plt.xlabel("x")
plt.ylabel("y")
plt.plot(x, y)
plt.show()

pyplotでのグラフ作成は、こちらの記事をチェックしてみてください!

linspace(start, stop, num) ⇒ startからstopまでをnum分割

startからstopまでをnum分割した数列を作成します。

stopも含まれる点に注意してください。

# linspace(start, stop, num)
x = np.linspace(0, 3.14, 5)
# x → array([0.   , 0.785, 1.57 , 2.355, 3.14 ])

オプショナル引数

たまに使用するオプショナル引数として

  • endpoint:終点を含めるかどうか
  • retstepstep幅を出力するかどうか

があります。

(正確には出力する数列の分割数numもオプショナルですが、頻繁に使うので、基本的な使い方で説明しました)

endpoint:終点を含めるかどうか

endpointで、出力する数列に終点を含めるかどうか指定できます。

デフォルトではTrueになっているので、何も指定しなければ終点が含まれます。

x1 = np.linspace(0, 10, 5, endpoint=True)
# x → array([ 0. ,  2.5,  5. ,  7.5, 10. ]) # 終点10が含まれる
x2 = np.linspace(0, 10, 5, endpoint=False)
# y → array([0., 2., 4., 6., 8.]) # 終点10は含まれない
# pyplotで出力
plt.plot(x1, np.zeros_like(x), "o", label="endpoint=True")
plt.plot(x2, np.zeros_like(x)+0.5, "o", label="endpoint=False")
plt.ylim([-0.5, 1])
plt.show()

endpointの真偽に関わらず要素数はnumで指定した分割数になっていますね。

retstep:stepサイズを出力

linspace()では、分割数numに応じて自動的に数列の間隔stepが計算されます。

通常、stepは出力されませんが、retstepTrueを指定することで、出力できます。

出力形式はタプルで、

  • (数列, step)

となるので、受け側もタプルで指定しておくと使い勝手がいいです。

x, step = np.linspace(0, 3.14, 5, retstep=True)
# x → array([0.   , 0.785, 1.57 , 2.355, 3.14 ])
# step → 0.785

start, stopに配列を指定

startstopに、配列を指定することもできます。

startstopそれぞれの同じ位置の要素を始点と終点にして数列を配列で作成します。

このとき、axisで出力配列のどの軸の方向に数列を分割するか指定できます。

x = np.linspace([0,10], [5,20], 3, axis=0)
# x → array([[ 0. , 10. ],
#            [ 2.5, 15. ],
#            [ 5. , 20. ]]) 
x = np.linspace([0,10], [5,20], 3, axis=1)
# x → array([[ 0. ,  2.5,  5. ],
#            [10. , 15. , 20. ]])

arange()とlinspace()の違い

linspace()と類似した関数にarange()関数があります。

どちらも等間隔の数列を生成しますが、それぞれ次の特徴があります。

  • arange():数列の間隔を指定
  • linspace():数列の要素数を指定

例えば

  • 0から100までの数字を10ずつ増やしたいと思った場合はarange()
  • 10個に区切りたいと思った場合はlinspace()

を使うと便利です。

x = np.arange(0, 100, 25)
# x → array([ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90])
y = np.linspace(0, 100, 10)
# y → array([  0.        ,  11.11111111,  22.22222222,  33.33333333,
#             44.44444444,  55.55555556,  66.66666667,  77.77777778,
#             88.88888889, 100.        ])

また最小限の引数を渡した(stopだけを指定した)場合の挙動が特徴的です。

  • arange(stop)0からstopまで1ずつ増加する整数列
  • linspacec(stop)0からstopまでを50分割した数列(整数とは限らない)

そのため、手軽に数列を作るときには

  • 整数列を作りたいときはarange()
  • グラフ作成で区間を細かく区切りたいときはlinspace()

が便利な印象です。

x = np.arange(0, 50)
# x → array([ 0,  1,  2,  3,..., 49]) #1ずつ増える整数列を作る
y = np.linspace(0, 10)
# y → array([ 0.  ,  0.20408163,  0.40816327,..., 10.]) #50要素にとにかく分割する

おわりに

linspace()を使いこなせるようになったら、あわせてarange()も覚えたいですね!

他にもnumpyの記事を書いていますのでぜひ見てみてください!