Pythonでデータサイエンスや機械学習、数値計算を行う際、特定の範囲内を等間隔に区切った数値配列を作成するシーンは非常に多く存在します。
グラフの描画、シミュレーションの入力値、あるいはニューラルネットワークの重み初期化など、その用途は多岐にわたります。
NumPyライブラリが提供するnp.linspaceは、こうした等間隔な数列を生成するための最も強力で直感的なツールの1つです。
本記事では、np.linspaceの基本的な使い方から各引数の詳細な挙動、そして混同されやすいnp.arangeとの決定的な違いについて詳しく解説します。
np.linspaceとは
np.linspaceは、指定した範囲内を指定した要素数で均等に分割した配列(ndarray)を返す関数です。
関数名の「linspace」は「Linear Space(線形空間)」を意味しており、文字通り数直線上の一定区間を線形に分割します。
最大の特徴は、「何刻みで作成するか(間隔)」ではなく「いくつ作成するか(要素数)」を指定する点にあります。
これにより、グラフのX軸を作成する際などに、「0から10の間を正確に100分割したい」といった要望を直感的に実装できます。
np.linspaceの基本構文と引数
まずは、np.linspaceのシグネチャを確認しましょう。
numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0)
それぞれの引数が持つ役割は以下の通りです。
| 引数名 | 説明 | デフォルト値 |
|---|---|---|
start | 数列の開始値。 | 必須 |
stop | 数列の終了値。 | 必須 |
num | 生成するサンプルの数。0以上の整数。 | 50 |
endpoint | Trueの場合、stopを数列に含める。Falseの場合は含まない。 | True |
retstep | Trueの場合、(配列, ステップサイズ)のタプルを返す。 | False |
dtype | 出力配列のデータ型。指定しない場合はfloatになる。 | None |
axis | startやstopが配列の場合、どの軸に沿ってサンプルを並べるか。 | 0 |
基本的な使用例
最もシンプルな使い方は、開始値、終了値、要素数の3つを指定する方法です。
import numpy as np
# 0から10までを5等分する
res = np.linspace(0, 10, 5)
print(res)
[ 0. 2.5 5. 7.5 10. ]
この例では、0から10の範囲が4つの区間(2.5刻み)で区切られ、合計で5つの要素が生成されています。
各引数の詳細解説
np.linspaceを使いこなすためには、主要なオプション引数の挙動を正しく理解しておく必要があります。
endpoint:終了値を含めるかどうか
endpoint引数は、stopで指定した値を配列の最後に含めるかどうかを制御します。
デフォルトはTrueです。
これをFalseに設定すると、stopを含まない範囲で等間隔な数列が生成されます。
これは、周期的な信号(サイン波など)を扱う際に、1周期の終わりの点と次の周期の始まりの点が重複しないようにする場合などに便利です。
# endpoint=True (デフォルト)
print("True :", np.linspace(0, 1, 5, endpoint=True))
# endpoint=False
print("False:", np.linspace(0, 1, 5, endpoint=False))
True : [0. 0.25 0.5 0.75 1. ]
False: [0. 0.2 0.4 0.6 0.8]
endpoint=Falseの場合、ステップサイズは「(stop – start) / num」となります。
一方、Trueの場合は「(stop – start) / (num – 1)」となります。
retstep:計算された間隔を取得する
retstepをTrueにすると、生成された配列と一緒に、計算されたステップサイズ(間隔)を返します。
# 配列とステップサイズを同時に取得
data, step = np.linspace(0, 10, 5, retstep=True)
print(f"Data: {data}")
print(f"Step: {step}")
Data: [ 0. 2.5 5. 7.5 10. ]
Step: 2.5
自分で計算し直す手間が省けるため、デバッグや動的なパラメータ調整に役立ちます。
dtype:データ型の指定
デフォルトでは浮動小数点数(float64)が返されますが、整数値の配列が必要な場合はdtypeを指定します。
# 整数型を指定
int_array = np.linspace(0, 10, 5, dtype=int)
print(int_array)
[ 0 2 5 7 10]
ただし、整数型を指定すると計算結果が丸められるため、厳密に等間隔にならない可能性がある点に注意してください。
np.linspace と np.arange の違い
NumPyで数列を作成する際、もう一つの主要な関数がnp.arangeです。
初心者の方が最も迷いやすいのが、この2つの使い分けです。
np.arange の特徴
np.arange(start, stop, step) は、「間隔(step)」を指定して数列を作成します。
Python標準のrange()関数に近い挙動をしますが、浮動小数点数も扱えるのが特徴です。
決定的な違い:要素数 vs 間隔
| 項目 | np.linspace | np.arange |
|---|---|---|
| 指定方法 | 要素数 (num) | 間隔 (step) |
| 終了値の扱い | デフォルトで含む (endpoint=True) | 含まない (未満) |
| 精度 | 非常に高い | 累積誤差の影響を受ける場合がある |
精度問題の具体例
浮動小数点数で間隔を指定する場合、np.arangeは注意が必要です。
コンピュータ内の浮動小数点演算には微細な誤差が含まれるため、指定したstepの累積によって、終了値が含まれたり含まれなかったりする不安定な挙動を示すことがあります。
# 0.1刻みで0.3まで作成したい場合
# np.arangeでは誤差の影響で結果が不安定になることがある
print("arange :", np.arange(0, 0.3, 0.1))
# np.linspaceなら確実に3つの要素が得られる
print("linspace :", np.linspace(0, 0.2, 3))
arange : [0. 0.1 0.2]
linspace : [0. 0.1 0.2]
上記の例ではarangeも正しく見えますが、境界値付近では意図しない要素数の増減が起こり得ます。
そのため、「指定した範囲をきれいに分割したい」場合は np.linspace を使うのが鉄則です。
実践的な活用シーン
np.linspaceが特によく使われる具体的な場面をいくつか見てみましょう。
1. 関数のグラフ描画
Matplotlibなどを使って関数のグラフを描画する場合、滑らかな曲線を作るためには大量の点が必要です。
import numpy as np
import matplotlib.pyplot as plt
# -2πから2πの間を100分割
x = np.linspace(-2 * np.pi, 2 * np.pi, 100)
y = np.sin(x)
plt.plot(x, y)
plt.show()
この場合、np.linspaceを使うことで、「描画エリアの左端から右端までをちょうど100個の点で埋める」という操作が簡単に行えます。
2. 多次元配列への適用(axis引数)
np.linspaceは、スカラー値だけでなく配列を入力として受け取ることも可能です。
これにより、複数の数列を同時に生成できます。
# 開始値と終了値を配列で指定
start = [0, 10, 100]
stop = [5, 20, 200]
# 軸を指定して3つの数列を同時に作成
res = np.linspace(start, stop, 5, axis=1)
print(res)
[[ 0. 1.25 2.5 3.75 5. ]
[ 10. 12.5 15. 17.5 20. ]
[100. 125. 150. 175. 200. ]]
このテクニックは、ベクトルの線形補間や、多次元空間のグリッド生成などで重宝されます。
注意点とTips
要素数(num)の指定ミス
numに指定するのは「区間の数」ではなく「要素の数」です。
例えば「0から1の間を0.1刻みにしたい」場合、要素は 0.0, 0.1, ..., 1.0 の11個必要になります。
10個と指定してしまうと、[0. , 0.111, 0.222, ...] のように中途半端な値になるため注意しましょう。
逆順の数列
startをstopより大きい値に設定すれば、簡単に降順(逆順)の数列を作成できます。
# 10から0へ向かう数列
rev = np.linspace(10, 0, 5)
print(rev)
[10. 7.5 5. 2.5 0. ]
まとめ
np.linspaceは、NumPyを利用する上で欠かせない基礎関数です。
- 要素数を指定して等間隔な配列を作る。
endpointで終了値の有無をコントロールできる。retstepで計算された間隔を確認できる。- 浮動小数点数の精度問題を避けるため、
np.arangeよりも推奨される場面が多い。
特にデータ可視化や数値シミュレーションにおいては、np.arangeよりもnp.linspaceの方が意図した通りの結果を得やすい傾向にあります。
両者の特性を正しく理解し、用途に応じて適切な関数を選択できるようにしておきましょう。
NumPyには他にも対数スケールで分割するnp.logspaceなど、便利な数列生成関数が存在します。
まずはこのnp.linspaceをマスターし、数値計算の土台を固めてみてください。
