【間違えやすい!】NumPyのarange関数とは?

python

Python初心者がNumPyを使い始めるときに、よくある間違いがあります。

それは、

numpy.arrange(...)と書いてエラーになる!

正しくは:

import numpy as np
np.arange(...)  # 「arange」が正解

「array(配列)」と「range(範囲)」を組み合わせた言葉なので「arange」が正しい関数名です。

この記事では、そんなnp.arangeの使い方・応用例・よくあるエラーまでを詳しく説明します。

スポンサーリンク

基本的な使い方

基本の書き方

import numpy as np
np.arange(開始, 終了, ステップ)

説明:

  • 開始:どの数から始めるか
  • 終了:どの数まで作るか(この数は含まれません)
  • ステップ:数と数の間隔

例1:0から9までの整数を作る

import numpy as np
result = np.arange(10)
print(result)
# 結果: [0 1 2 3 4 5 6 7 8 9]

説明:

  • 引数がひとつだけの場合、0から始まって指定した数の手前まで作られます
  • 10を指定しましたが、結果には含まれていないことに注意

例2:1から10まで2刻み

result = np.arange(1, 11, 2)
print(result)
# 結果: [1 3 5 7 9]

説明:

  • 1から始まって、2ずつ増えていきます
  • 11は含まれないので、9で終わります

例3:小数も使える

result = np.arange(0, 1, 0.2)
print(result)
# 結果: [0.  0.2 0.4 0.6 0.8]

説明:

  • ステップに小数を指定することもできます
  • 1.0は含まれないので、0.8で終わります

例4:逆順(減少)も可能

result = np.arange(10, 0, -2)
print(result)
# 結果: [10  8  6  4  2]

説明:

  • ステップに負の数を指定すると、逆順で作れます

まとめ

  • arange開始・終了・間隔を指定して配列を作る便利な関数
  • Pythonのrange()と似ていますが、NumPy配列を作ります

arangeとlinspaceの違い

関数指定するもの特徴使う場面
arange()ステップ(刻み幅)間隔を決める単純な連続数字
linspace()要素数(分割数)個数を決める精密な等間隔

arangeは「ステップ指定」

import numpy as np
result = np.arange(0, 1, 0.3)
print(result)
# 結果: [0.  0.3 0.6 0.9]

特徴:

  • ステップ(0.3)を指定するため、終了値(1.0)は含まれないことがあります
  • 何個の要素ができるかは、計算してみないとわかりません

linspaceは「個数指定」

import numpy as np
result = np.linspace(0, 1, 5)
print(result)
# 結果: [0.   0.25 0.5  0.75 1.  ]

特徴:

  • 要素数(5個)を指定するため、開始から終了まできっちり分割されます
  • 終了値も含まれます

どちらを使うべき?

# グラフ用のx軸を作るとき
x1 = np.arange(0, 10, 0.5)     # 0.5刻みで作りたい
x2 = np.linspace(0, 10, 21)    # 21個の点で分割したい

# データ分析で連番を作るとき
indices = np.arange(100)       # 0から99までの連番

# 実験データで等間隔の測定点を作るとき
measurement_points = np.linspace(0, 100, 11)  # 0〜100を10等分

まとめ

  • 間隔を決めたい → arange
  • 個数を決めたい → linspace

よくあるエラーと注意点

注意点1:「終了値が含まれない」

import numpy as np
result = np.arange(0, 5)
print(result)
# 結果: [0 1 2 3 4] ← 5は含まれない!

理由:

  • Pythonのrange()と同じ仕様です
  • 「5未満」という意味になります

対策:

# 5まで含めたい場合
result = np.arange(0, 6)  # 終了値を1つ多く指定
print(result)
# 結果: [0 1 2 3 4 5]

注意点2:小数ステップでの精度誤差

import numpy as np
result = np.arange(0, 1, 0.1)
print(result)
# 結果: [0.  0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]
print(len(result))  # 10個のはず

問題: コンピューターの小数計算の誤差により、期待した個数にならない場合があります

対策1:linspaceを使う

result = np.linspace(0, 0.9, 10)
print(result)
# 結果: [0.  0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]

対策2:整数で作ってから割る

result = np.arange(0, 10) / 10
print(result)
# 結果: [0.  0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]

注意点3:データ型に注意

import numpy as np

# 整数だけを使うと整数型の配列
int_array = np.arange(0, 5)
print(int_array.dtype)  # 結果: int64

# 小数を使うと浮動小数点型の配列
float_array = np.arange(0, 5, 0.5)
print(float_array.dtype)  # 結果: float64

明示的に型を指定する方法:

# 整数型で作る
result = np.arange(0, 5, dtype=int)

# 浮動小数点型で作る
result = np.arange(0, 5, dtype=float)

応用例:実践的な使い方

応用1:2次元配列への変換

import numpy as np

# 12個の連続数字を作って、3行4列に変換
result = np.arange(12).reshape(3, 4)
print(result)
# 結果:
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

説明:

  • reshape()を使うと、1次元配列を多次元配列に変換できます
  • データ分析でよく使われるテクニックです

応用2:条件をつけてフィルタリング

import numpy as np

# 0から9までの配列を作る
numbers = np.arange(10)
print(f"元の配列: {numbers}")

# 偶数だけを取り出す
even_numbers = numbers[numbers % 2 == 0]
print(f"偶数のみ: {even_numbers}")

# 5より大きい数を取り出す
large_numbers = numbers[numbers > 5]
print(f"5より大きい: {large_numbers}")

結果:

元の配列: [0 1 2 3 4 5 6 7 8 9]
偶数のみ: [0 2 4 6 8]
5より大きい: [6 7 8 9]

応用3:グラフ用のデータ作成

import numpy as np
import matplotlib.pyplot as plt

# x軸のデータを作成(0から2πまで0.1刻み)
x = np.arange(0, 2 * np.pi, 0.1)

# sin波のy軸データを計算
y = np.sin(x)

# グラフを描画
plt.plot(x, y)
plt.title('sin波のグラフ')
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.show()

説明:

  • グラフを描くときのx軸データ作成によく使われます
  • 数学関数のグラフ化にとても便利です

応用4:データ分析での連番作成

import numpy as np
import pandas as pd

# 100個のサンプルデータのインデックスを作成
sample_ids = np.arange(1, 101)  # 1から100まで

# ランダムなデータと組み合わせてDataFrameを作成
np.random.seed(42)  # 再現可能な結果のため
data = {
    'sample_id': sample_ids,
    'value': np.random.normal(50, 10, 100)  # 平均50、標準偏差10の正規分布
}

df = pd.DataFrame(data)
print(df.head())

結果:

   sample_id      value
0          1  54.967141
1          2  47.617441
2          3  64.768854
3          4  52.302986
4          5  54.658191

PythonのrangeとNumPyのarangeの違い

特徴range()np.arange()
返り値の型range オブジェクトNumPy配列
小数の対応×(整数のみ)
数学的計算×
メモリ効率○(遅延評価)△(配列を作成)

使い分けの例

import numpy as np

# for文で使うだけなら range
for i in range(10):
    print(i)

# 数学的計算をするなら arange
numbers = np.arange(10)
squared = numbers ** 2  # 全要素を一度に2乗
print(squared)
# 結果: [ 0  1  4  9 16 25 36 49 64 81]

# 小数が必要なら arange
decimal_numbers = np.arange(0, 1, 0.1)

まとめ

操作内容コマンド例使う場面
基本的な整数配列np.arange(10)連番が欲しい
範囲と間隔を指定np.arange(0, 10, 2)特定の刻みで数字を作りたい
小数の配列np.arange(0, 1, 0.1)細かい刻みが必要
2次元配列への変換np.arange(12).reshape(3, 4)行列を作りたい
条件フィルタarr[arr > 5]条件に合うデータだけ取得
精密な等間隔np.linspace(0, 1, 11)きっちり分割したい

よくある質問と回答

Q: なぜ「arrange」ではなく「arange」なの?

A: 「array(配列)」と「range(範囲)」を組み合わせた造語だからです。英語の「arrange(整理する)」とは関係ありません。

Q: rangeとarangeどちらを使うべき?

A:

  • 単純なループならrange()
  • 数学計算や配列操作ならnp.arange()
  • 小数が必要ならnp.arange()

Q: 終了値を含めたいときはどうする?

A: 終了値に1を足すか、np.linspace()を使いましょう。

# 方法1: 終了値に1を足す
np.arange(0, 11)  # 0から10まで

# 方法2: linspaceを使う
np.linspace(0, 10, 11)  # 0から10まで11個

コメント

タイトルとURLをコピーしました