NumPy Arange:等間隔の値を持つ配列を作成する方法
Updated on
等間隔の数値の配列を作成することは、科学計算、データ分析、機械学習において最も一般的な操作の1つです。ループ用のインデックスのシーケンス、プロット用のX軸の値、シミュレーション用のグリッド座標が必要な場合でも、高速で信頼性の高い生成方法が必要です。Pythonの組み込み関数 range() は整数に対しては機能しますが、浮動小数点のステップが必要な場合やベクトル化された計算のためにNumPy配列として結果が必要な場合には対応できません。
まさにこれを解決するのが numpy.arange() です。開始点、終了点、ステップサイズ、データ型を完全に制御しながら、等間隔の値の配列を1回の関数呼び出しで生成します。このガイドでは、すべてのパラメータを解説し、実践的な例を示し、np.arange() を range() や np.linspace() などの代替手段と比較し、最も一般的なミスを回避する方法を説明します。
np.arange() の機能
np.arange() は、指定された区間内の等間隔の値を含む1次元NumPy配列を返します。Pythonの range() のNumPy版ですが、rangeオブジェクトの代わりに ndarray を返し、浮動小数点数をサポートしています。
完全な関数シグネチャは次のとおりです:
numpy.arange([start, ] stop, [step, ] dtype=None)パラメータリファレンス
| パラメータ | 説明 | デフォルト |
|---|---|---|
start | 区間の開始(含む) | 0 |
stop | 区間の終了(含まない) | 必須 |
step | 連続する値の間隔 | 1 |
dtype | 出力配列のデータ型(例:int、float、np.float32) | 入力から推論 |
この関数は start から値を生成し、step ずつ増加させ、stop に達する前に停止します。この「排他的なstop」の動作は、Pythonの range() と一致しています。
基本的な使い方:Stop値のみ
np.arange() を使う最も簡単な方法は、引数を1つだけ渡すことです。1つの値を渡すと、それは stop として扱われ、start はデフォルトで 0、step は 1 になります。
import numpy as np
arr = np.arange(5)
print(arr)
# Output: [0 1 2 3 4]
print(type(arr))
# Output: <class 'numpy.ndarray'>これにより、0から5未満までの整数の配列が作成されます。結果はPythonリストではなく、NumPyの ndarray であることに注意してください。つまり、ベクトル化された演算でそのまま使用できます:
import numpy as np
arr = np.arange(5)
print(arr * 10)
# Output: [ 0 10 20 30 40]
print(arr ** 2)
# Output: [ 0 1 4 9 16]StartとStopの使用
2つの引数を渡して、シーケンスの開始位置と終了位置を制御します:
import numpy as np
arr = np.arange(2, 10)
print(arr)
# Output: [2 3 4 5 6 7 8 9]配列は 2(含む)から始まり、10(含まない)の前で停止します。デフォルトのステップは引き続き 1 です。
負の開始値も使用できます:
import numpy as np
arr = np.arange(-3, 4)
print(arr)
# Output: [-3 -2 -1 0 1 2 3]Start、Stop、Stepの使用
3番目の引数は値の間隔を制御します。ここで np.arange() が range() よりもはるかに強力になります。ステップに浮動小数点数を使用できるからです:
import numpy as np
arr = np.arange(0, 1, 0.1)
print(arr)
# Output: [0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]整数のステップも同様に機能します:
import numpy as np
arr = np.arange(0, 20, 3)
print(arr)
# Output: [ 0 3 6 9 12 15 18]ステップは任意の正の数にできます。シーケンスは常に stop 値に達する前に停止します。
浮動小数点のステップサイズと精度の問題
浮動小数点のステップサイズの使用は便利ですが、注意点があります:浮動小数点演算は正確ではありません。小さな丸め誤差が蓄積し、時折予期しない結果を生む可能性があります。
次の例を考えてみましょう:
import numpy as np
arr = np.arange(0, 1, 0.3)
print(arr)
# Output: [0. 0.3 0.6 0.9]
print(len(arr))
# Output: 4これは正しく見えます。しかし、特定のステップサイズで何が起こるか見てみましょう:
import numpy as np
arr = np.arange(0, 1.0, 0.1)
print(len(arr))
# Output: 10
arr2 = np.arange(0.0, 1.0 + 1e-10, 0.1)
print(len(arr2))
# Output: 11浮動小数点表現のため、2進数では 0.1 * 10 が正確に 1.0 と等しくない場合があります。結果の要素数は、特定の値に応じて1つ変わる可能性があります。
ベストプラクティス: 正確な数の等間隔浮動小数点値が必要な場合は、代わりに np.linspace() を使用してください。np.arange() は、要素の正確な数が重要でない場合にのみ、浮動小数点シーケンスに使用してください。
負のステップ:カウントダウン
負の step を設定して、降順のシーケンスを作成します:
import numpy as np
arr = np.arange(10, 0, -1)
print(arr)
# Output: [10 9 8 7 6 5 4 3 2 1]浮動小数点のステップも同様に機能します:
import numpy as np
arr = np.arange(2.0, 0.0, -0.5)
print(arr)
# Output: [2. 1.5 1. 0.5]重要なルール:ステップの方向は、start から stop への方向と一致する必要があります。start < stop の場合、ステップは正でなければなりません。start > stop の場合、ステップは負でなければなりません。これを間違えると、空の配列が生成されます(以下のエラーセクションで説明)。
dtypeパラメータ
デフォルトでは、np.arange() は渡された引数からデータ型を推論します。すべての引数が整数の場合、整数配列が得られます。いずれかの引数が浮動小数点数の場合、浮動小数点配列が得られます。dtype パラメータでこれをオーバーライドできます:
import numpy as np
# Default: integers in, integers out
arr_int = np.arange(5)
print(arr_int.dtype)
# Output: int64
# Default: float step, float output
arr_float = np.arange(0, 5, 0.5)
print(arr_float.dtype)
# Output: float64
# Force float output from integer inputs
arr_forced = np.arange(5, dtype=np.float32)
print(arr_forced)
# Output: [0. 1. 2. 3. 4.]
print(arr_forced.dtype)
# Output: float32
# Force integer output (values get truncated)
arr_trunc = np.arange(0, 2, 0.5, dtype=int)
print(arr_trunc)
# Output: [0 0 1 1]最後の例に注目してください:浮動小数点シーケンスに整数dtypeを強制すると、各値は丸められるのではなく切り捨てられます。これにより重複した値や予期しない結果が生じる可能性があるため、慎重に使用してください。
np.arange() vs range():それぞれの使い分け
Pythonの組み込み range() とNumPyの np.arange() はどちらも数値のシーケンスを生成しますが、異なる目的で使用されます。
| 機能 | range() | np.arange() |
|---|---|---|
| 戻り値の型 | range オブジェクト(遅延イテレータ) | numpy.ndarray(メモリ上) |
| 浮動小数点のサポート | なし(整数のみ) | あり |
| ベクトル化された計算 | なし(リスト変換が必要) | あり(直接的な配列演算) |
| メモリ | 非常に少ない(オンデマンド生成) | 配列がメモリに格納される |
| イテレーション速度 | Pythonループで高速 | Pythonループでは低速 |
| 計算速度 | 低速(先に変換が必要) | 高速(ベクトル化されたC演算) |
| NumPy/SciPyでの使用 | np.array() で変換が必要 | 直接使用可能 |
| スライス/インデックス結果 | range オブジェクトを返す | ndarray を返す |
range() を使う場合: インデックスが必要で、シーケンス自体に対する計算を行わない純粋なPythonループ。
np.arange() を使う場合: 結果が数値計算で使用される、NumPy/SciPy関数に渡される、または浮動小数点値を含む必要がある場合。
import numpy as np
# range() for loop iteration
for i in range(5):
print(i, end=' ')
# Output: 0 1 2 3 4
print()
# np.arange() for vectorized math
x = np.arange(5)
print(np.sin(x))
# Output: [ 0. 0.84147098 0.90929743 0.14112001 -0.7568025 ]np.arange() vs np.linspace():それぞれの使い分け
どちらの関数も等間隔の値の配列を作成しますが、間隔の定義方法が異なります。
| 機能 | np.arange() | np.linspace() |
|---|---|---|
| 指定するもの | ステップサイズ | ポイント数 |
| Stop値 | デフォルトで除外 | デフォルトで含む |
| 浮動小数点の精度 | 予期しない要素数になる可能性あり | 常に正確な数を生成 |
| 典型的な用途 | 整数シーケンス、既知のステップサイズ | 範囲内の正確なポイント数 |
| 構文 | np.arange(start, stop, step) | np.linspace(start, stop, num) |
| カウント情報を返す | なし | オプション(retstep=True) |
違いを明確に示す比較例を見てみましょう:
import numpy as np
# arange: "give me values from 0 to 1, stepping by 0.2"
a = np.arange(0, 1, 0.2)
print(f"arange: {a} (length: {len(a)})")
# Output: arange: [0. 0.2 0.4 0.6 0.8] (length: 5)
# linspace: "give me exactly 6 values from 0 to 1"
b = np.linspace(0, 1, 6)
print(f"linspace: {b} (length: {len(b)})")
# Output: linspace: [0. 0.2 0.4 0.6 0.8 1. ] (length: 6)np.linspace() は端点(1.0)を含み、正確に6つの値を保証しますが、np.arange() は 1.0 の前で停止し、カウントは浮動小数点のステップ計算に依存します。
経験則: ステップサイズが重要な場合は np.arange() を使用してください。ポイント数が重要な場合は np.linspace() を使用してください。
一般的なユースケース
ループインデックスと配列のインデックス付け
import numpy as np
data = np.array([10, 20, 30, 40, 50])
indices = np.arange(len(data))
print(indices)
# Output: [0 1 2 3 4]
# Use for conditional selection
mask = indices % 2 == 0
print(data[mask])
# Output: [10 30 50]プロット用のX軸の値
import numpy as np
x = np.arange(0, 2 * np.pi, 0.01)
y = np.sin(x)
print(f"x has {len(x)} points, from {x[0]:.2f} to {x[-1]:.2f}")
# Output: x has 629 points, from 0.00 to 6.28
print(f"y ranges from {y.min():.4f} to {y.max():.4f}")
# Output: y ranges from -1.0000 to 1.0000x と y をmatplotlibの plt.plot(x, y) に直接渡して、滑らかな正弦波を描画できます。
グリッド座標の作成
import numpy as np
x = np.arange(0, 3)
y = np.arange(0, 4)
xx, yy = np.meshgrid(x, y)
print("xx:")
print(xx)
# Output:
# [[0 1 2]
# [0 1 2]
# [0 1 2]
# [0 1 2]]
print("yy:")
print(yy)
# Output:
# [[0 0 0]
# [1 1 1]
# [2 2 2]
# [3 3 3]]このパターンは、画像処理、ヒートマップ、3Dサーフェスプロットで広く使用されています。
時間ベースのシーケンスの生成
import numpy as np
# Hours from 0 to 24 in 30-minute intervals
hours = np.arange(0, 24.5, 0.5)
print(f"Time points: {len(hours)}")
# Output: Time points: 49
print(hours[:6])
# Output: [0. 0.5 1. 1.5 2. 2.5]よくあるエラーとその修正方法
ステップの方向が間違っていることによる空の配列
np.arange() で最も頻繁に起こるミスは、間違った方向のステップを使用することです:
import numpy as np
# Trying to count down with a positive step
arr = np.arange(10, 0, 1)
print(arr)
# Output: []
# Trying to count up with a negative step
arr2 = np.arange(0, 10, -1)
print(arr2)
# Output: []どちらもエラーや警告なしに空の配列を返します。修正は簡単です。ステップの方向が start から stop への方向と一致していることを確認してください:
import numpy as np
# Correct: counting down with negative step
arr = np.arange(10, 0, -1)
print(arr)
# Output: [10 9 8 7 6 5 4 3 2 1]ステップサイズがゼロ
ステップが 0 の場合は常に無効で、エラーが発生します:
import numpy as np
try:
arr = np.arange(0, 10, 0)
except ZeroDivisionError as e:
print(f"Error: {e}")
# Output: Error: division by zero予期しない巨大な配列
np.arange() は配列全体を一度にメモリに作成するため、大きな範囲に対して非常に小さなステップを使用すると、数ギガバイトのRAMを消費する可能性があります:
import numpy as np
# This creates 10 billion elements -- do NOT run this
# arr = np.arange(0, 10, 0.000000001)
# Check the size first
count = int((10 - 0) / 0.000000001)
print(f"This would create {count:,} elements")
# Output: This would create 10,000,000,000 elements
print(f"Memory: ~{count * 8 / 1e9:.1f} GB (for float64)")
# Output: Memory: ~80.0 GB (for float64)大きなシーケンスを生成する前に、常にサイズを見積もってください。
RunCellでNumPyを試してみましょう
これらの例をインタラクティブに試し、NumPyを学びながらAIによるサポートを受けたい場合は、RunCell (opens in a new tab)をチェックしてください。RunCellはJupyterに直接組み込まれたAIエージェントで、データサイエンティストがコードの作成、デバッグ、最適化を行うのを支援します。
ドキュメントタブとノートブックを切り替える代わりに、RunCellに np.arange() の例を生成させたり、浮動小数点の精度の動作を説明させたり、特定のユースケースに対して arange と linspace のどちらを選ぶべきかを相談したりできます。既存のJupyter環境で直接実行されるため、セットアップの手間はありません。インストールして、コードセルの横で質問を始めるだけです。
NumPyの配列作成関数を初めて探索する場合に特に便利です。リアルタイムで例を反復し、結果をすぐに確認できるからです。
FAQ
numpy arangeは何を返しますか?
np.arange() は、等間隔の値を含む1次元NumPy ndarray を返します。遅延イテレータを返すPythonの range() とは異なり、np.arange() は完全な配列をメモリに生成します。配列はベクトル化された演算、ブロードキャスティング、すべての標準NumPy関数をサポートしています。
numpy arangeは浮動小数点のステップ値を使用できますか?
はい。整数のみを受け付けるPythonの range() とは異なり、np.arange() は浮動小数点のstart、stop、step値を完全にサポートしています。例えば、np.arange(0, 1, 0.1) は [0.0, 0.1, 0.2, ..., 0.9] を生成します。ただし、浮動小数点の丸めにより、結果の要素数が予想より1つ多いまたは少なくなる場合があることに注意してください。正確な要素数が必要な場合は np.linspace() を使用してください。
np.arangeとnp.linspaceの違いは何ですか?
np.arange() はステップサイズを取り、stop値(排他的)に達するまで値を生成します。np.linspace() は必要なポイント数を取り、デフォルトで端点を含むようにステップサイズを自動的に計算します。ステップサイズがわかっている場合は arange を使用してください。必要なポイント数がわかっている場合は linspace を使用してください。
np.arangeが空の配列を返すのはなぜですか?
ステップの方向がstartからstopへの方向と一致しない場合、空の配列が返されます。例えば、np.arange(10, 0, 1) は空の配列を返します。正のステップでは10から0に向かって移動できないためです。修正方法は負のステップを使用することです:np.arange(10, 0, -1)。
np.arangeはstop値を含みますか、それとも含みませんか?
stop値は排他的です。出力に含まれることはありません。np.arange(0, 5) は [0, 1, 2, 3, 4] を返し、[0, 1, 2, 3, 4, 5] ではありません。これはPythonの組み込み range() の動作と一致しています。端点を含める必要がある場合は、endpoint=True(デフォルト)で np.linspace() を使用してください。
まとめ
np.arange() がNumPyで最もよく使用される関数の1つである理由があります:Pythonで等間隔の数値の配列を生成する最も速い方法だからです。覚えておくべきポイントをまとめます:
- 引数1つ(
np.arange(n))は0からn-1までの整数を作成します。 - 引数2つ(
np.arange(start, stop))はデフォルトのステップ1で範囲を定義します。 - 引数3つ(
np.arange(start, stop, step))は、浮動小数点ステップや降順シーケンスのための負のステップを含む完全な制御を提供します。 dtypeは特定のデータ型が必要な場合に、自動型推論をオーバーライドします。- ステップサイズが重要な場合は
np.arange()を使用してください。ポイント数が重要な場合はnp.linspace()を使用してください。 - 浮動小数点の精度に注意 -- 浮動小数点ステップを使用した
np.arange()は、予期しない数の要素を生成する可能性があります。 - 空の配列は、ステップの方向とstartからstopへの方向の不一致から生じます。
NumPy配列のインタラクティブな実験には、RunCell (opens in a new tab)がJupyter内で直接AIアシスト付きコーディングを提供し、ノートブックを離れることなく np.arange() のバリエーションをテストして即座に説明を得ることができます。