セクション5:Python for Data Analysis Numpyを視聴しました。
配列を自動生成するコードでどこまでの数が作成されるかの感覚が分からない
①np.arange(0,10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
②np.arange(0,11,2)
array([ 0, 2, 4, 6, 8, 10])
③np.linspace(0,10,3)
array([ 0., 5., 10.])
それぞれ赤文字の部分がどの数までを出力するかを指示してると思うのですが
①、②のケースでは10まであるいは11までと指示してその1つ手前の数まで実際は出力されるので、あぁ1つ手前の数字まで出てくるんだなと思ってると
③のケースでは10までと指示して10まで出ている
メソッド | 第2引数の意味 | 含まれるか? | 説明 |
---|---|---|---|
np.arange |
終了値 (含まない) | 含まれない | 開始値から「終了値未満」まで指定されたステップで値を生成する |
np.linspace |
終了値 (含む) | 含まれる | 開始値から終了値までを指定された要素数で等間隔に分割する |
なぜ仕様が違う?
np.arange は整数値や浮動小数点数を一定のステップで生成するため、終了値を含めない方が多くの場合便利です(例えばループの範囲指定など)。
np.linspace は範囲を等間隔で分割する用途に特化しており、開始値と終了値を含める方が期待されるケースが多いです。
上記を受けてチャッピー先生への追加質問
終了値を含むか含まないかは丸暗記するしかないのでしょうか?
初めて使用するコードでどこまで含まれるかを判断する方法や根本的な原則はありますか?
NumPy 配列生成メソッドの終了値の扱いを判断する方法
NumPyでnp.arange
やnp.linspace
を使う際、「終了値が含まれるか」を迷うことがありますが、以下のポイントを押さえると判断しやすくなります。
判断の原則
1. 用途で判断する
-
範囲やステップに着目するメソッド
→ 終了値は含まれないことが多い。- 例:
np.arange
,range
- 理由: 「開始値から終了値未満まで」の方がループや範囲指定に便利。
- 例:
-
要素数や等間隔分割に着目するメソッド
→ 終了値が含まれることが多い。- 例:
np.linspace
- 理由: 開始値と終了値を含む方が直感的。
- 例:
2. Python設計の共通ルール
-
終了値は基本的に「含まれない (半開区間)」設計が多い。
- 例:
range
,np.arange
- 例:
- 例外: 等間隔分割など、両端を含める方が自然な場合。
3. 実際に試して確認
終了値が不明な場合は、少量の値で挙動を確認すると良いです。
import numpy as np
# np.arange の例
print(np.arange(0, 5)) # [0, 1, 2, 3, 4]
# np.linspace の例
print(np.linspace(0, 10, 3)) # [ 0. 5. 10.]