閉じる

NumPyのnp.linspaceで等間隔の数列を生成する方法:引数の使い方とnp.arangeとの使い分けを解説

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のシグネチャを確認しましょう。

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

それぞれの引数が持つ役割は以下の通りです。

引数名説明デフォルト値
start数列の開始値。必須
stop数列の終了値。必須
num生成するサンプルの数。0以上の整数。50
endpointTrueの場合、stopを数列に含める。Falseの場合は含まない。True
retstepTrueの場合、(配列, ステップサイズ)のタプルを返す。False
dtype出力配列のデータ型。指定しない場合はfloatになる。None
axisstartやstopが配列の場合、どの軸に沿ってサンプルを並べるか。0

基本的な使用例

最もシンプルな使い方は、開始値、終了値、要素数の3つを指定する方法です。

Python
import numpy as np

# 0から10までを5等分する
res = np.linspace(0, 10, 5)

print(res)
Python
[ 0.   2.5  5.   7.5 10. ]

この例では、0から10の範囲が4つの区間(2.5刻み)で区切られ、合計で5つの要素が生成されています。

各引数の詳細解説

np.linspaceを使いこなすためには、主要なオプション引数の挙動を正しく理解しておく必要があります。

endpoint:終了値を含めるかどうか

endpoint引数は、stopで指定した値を配列の最後に含めるかどうかを制御します。

デフォルトはTrueです。

これをFalseに設定すると、stopを含まない範囲で等間隔な数列が生成されます。

これは、周期的な信号(サイン波など)を扱う際に、1周期の終わりの点と次の周期の始まりの点が重複しないようにする場合などに便利です。

Python
# endpoint=True (デフォルト)
print("True :", np.linspace(0, 1, 5, endpoint=True))

# endpoint=False
print("False:", np.linspace(0, 1, 5, endpoint=False))
Python
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:計算された間隔を取得する

retstepTrueにすると、生成された配列と一緒に、計算されたステップサイズ(間隔)を返します。

Python
# 配列とステップサイズを同時に取得
data, step = np.linspace(0, 10, 5, retstep=True)

print(f"Data: {data}")
print(f"Step: {step}")
Python
Data: [ 0.   2.5  5.   7.5 10. ]
Step: 2.5

自分で計算し直す手間が省けるため、デバッグや動的なパラメータ調整に役立ちます。

dtype:データ型の指定

デフォルトでは浮動小数点数(float64)が返されますが、整数値の配列が必要な場合はdtypeを指定します。

Python
# 整数型を指定
int_array = np.linspace(0, 10, 5, dtype=int)

print(int_array)
Python
[ 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.linspacenp.arange
指定方法要素数 (num)間隔 (step)
終了値の扱いデフォルトで含む (endpoint=True)含まない (未満)
精度非常に高い累積誤差の影響を受ける場合がある

精度問題の具体例

浮動小数点数で間隔を指定する場合、np.arangeは注意が必要です。

コンピュータ内の浮動小数点演算には微細な誤差が含まれるため、指定したstepの累積によって、終了値が含まれたり含まれなかったりする不安定な挙動を示すことがあります。

Python
# 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))
Python
arange   : [0.  0.1 0.2]
linspace : [0.  0.1 0.2]

上記の例ではarangeも正しく見えますが、境界値付近では意図しない要素数の増減が起こり得ます。

そのため、「指定した範囲をきれいに分割したい」場合は np.linspace を使うのが鉄則です。

実践的な活用シーン

np.linspaceが特によく使われる具体的な場面をいくつか見てみましょう。

1. 関数のグラフ描画

Matplotlibなどを使って関数のグラフを描画する場合、滑らかな曲線を作るためには大量の点が必要です。

Python
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は、スカラー値だけでなく配列を入力として受け取ることも可能です。

これにより、複数の数列を同時に生成できます。

Python
# 開始値と終了値を配列で指定
start = [0, 10, 100]
stop = [5, 20, 200]

# 軸を指定して3つの数列を同時に作成
res = np.linspace(start, stop, 5, axis=1)

print(res)
Python
[[  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.011個必要になります。

10個と指定してしまうと、[0. , 0.111, 0.222, ...] のように中途半端な値になるため注意しましょう。

逆順の数列

startstopより大きい値に設定すれば、簡単に降順(逆順)の数列を作成できます。

Python
# 10から0へ向かう数列
rev = np.linspace(10, 0, 5)
print(rev)
Python
[10.   7.5  5.   2.5  0. ]

まとめ

np.linspaceは、NumPyを利用する上で欠かせない基礎関数です。

  • 要素数を指定して等間隔な配列を作る。
  • endpointで終了値の有無をコントロールできる。
  • retstepで計算された間隔を確認できる。
  • 浮動小数点数の精度問題を避けるため、np.arangeよりも推奨される場面が多い。

特にデータ可視化や数値シミュレーションにおいては、np.arangeよりもnp.linspaceの方が意図した通りの結果を得やすい傾向にあります。

両者の特性を正しく理解し、用途に応じて適切な関数を選択できるようにしておきましょう。

NumPyには他にも対数スケールで分割するnp.logspaceなど、便利な数列生成関数が存在します。

まずはこのnp.linspaceをマスターし、数値計算の土台を固めてみてください。

クラウドSSLサイトシールは安心の証です。

URLをコピーしました!