numpy
には、配列ndarray
を生成するための様々な関数があります。
等間隔の数列を生成する関数linspace()
を紹介します。
配列ndarray
の基本はこちらをチェック!
linspace()の使い方
linspace()
は、0, 0.1, 0.2, 0.3, …
のような等間隔の数値配列を作成します。
引数で数列の
- 始点
start
- 終点
stop
- 分割点の数
num
(デフォルト50
)
を指定することができます。
他にもオプション引数で、
endpoint
:終点を含むかどうか(デフォルトTrue
)retstep
:step
サイズを返すかどうか(デフォルト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
:終点を含めるかどうかretstep
:step
幅を出力するかどうか
があります。
(正確には出力する数列の分割数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
は出力されませんが、retstep
にTrue
を指定することで、出力できます。
出力形式はタプルで、
- (
数列
,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に配列を指定
start
とstop
に、配列を指定することもできます。
start
とstop
それぞれの同じ位置の要素を始点と終点にして数列を配列で作成します。
このとき、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
の記事を書いていますのでぜひ見てみてください!