折りたたみを展開する

おぼえ書き、まとめ、発表など

numpy arange と linspaceのちがい

細かくて、気付かない

あまり気にしないで使っていたが、numpy には arangelinspace がある。似ているが、違う性質を持っている。

f:id:Rlan:20170531234035p:plain ドキュメントを引用してみると、

numpy.arange — NumPy v1.13 Manual

numpy.arange

Return evenly spaced values within a given interval.

Values are generated within the half-open interval [start, stop) (in other words, the interval including start but excluding stop). For integer arguments the function is equivalent to the Python built-in range function, but returns an ndarray rather than a list.

であって、

numpy.linspace — NumPy v1.13 Manual

numpy.linspace

numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)[source] Return evenly spaced numbers over a specified interval. Returns num evenly spaced samples, calculated over the interval [start, stop].

The endpoint of the interval can optionally be excluded.

であるそう。ただ、どちらの関数も引数にとった範囲を刻んで array で返してくれる関数だ *1 。

気になった違いをまとめる

ドキュメントを読んで気になった違いをまとめてみる。各関数はデフォルトでは、

numpy.arange

  • 最後の値は含まない配列を返す
  • 最初の値を指定しなくても良い
  • ステップの数を指定しなくてもよい

numpy.linspace

  • 最後の値は含む配列を返す
  • 最初と最後の値を指定する必要がある
  • ステップの数を指定する(デフォルトでは50ステップになっている)

のような点が違う点であると思う。

最後の値を含むかどうか

arrangeは最初の値は含むが、最後の値は含まない*2

np.arange(1, 10)
>>> array([1, 2, 3, 4, 5, 6, 7, 8, 9])

linespaceは最初と最後の値を含む

np.linspace(1,10, 10)
>>> array([  1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.,  10.])

最初と最後を指定する必要があるかどうか

arrangeは必ずしも最初と最後の値を引数に取る必要はない

np.arange(10)
>>> array([1, 2, 3, 4, 5, 6, 7, 8, 9])

しかし、linspaceは最初と最後の値を引数に取る

np.linspace(10)
>>> ---------------------------------------------------------------------------
>>> TypeError                                 Traceback (most recent call last)
>>> <ipython-input-12-e01aa1d69cee> in <module>()
>>>> ----> 1 np.linspace(10)

>>> TypeError: linspace() missing 1 required positional argument: 'stop'

ステップ数を指定する必要があるかどうか

arrangeでは前のブロックで見たように引数が一つだけの場合は、1からその数まで1ずつステップを踏む

np.arange(10)
>>> array([1, 2, 3, 4, 5, 6, 7, 8, 9])

しかし、linspaceはステップ数を指定する必要がある。だが、ステップ数を指定しなかったとしてもエラーが出るわけではない。

np.linspace(1, 10)
>>> array([  1.        ,   1.18367347,   1.36734694,   1.55102041,
         1.73469388,   1.91836735,   2.10204082,   2.28571429,
         2.46938776,   2.65306122,   2.83673469,   3.02040816,
         3.20408163,   3.3877551 ,   3.57142857,   3.75510204,
         3.93877551,   4.12244898,   4.30612245,   4.48979592,
         4.67346939,   4.85714286,   5.04081633,   5.2244898 ,
         5.40816327,   5.59183673,   5.7755102 ,   5.95918367,
         6.14285714,   6.32653061,   6.51020408,   6.69387755,
         6.87755102,   7.06122449,   7.24489796,   7.42857143,
         7.6122449 ,   7.79591837,   7.97959184,   8.16326531,
         8.34693878,   8.53061224,   8.71428571,   8.89795918,
         9.08163265,   9.26530612,   9.44897959,   9.63265306,
         9.81632653,  10.        ])

なぜなら、デフォルトではステップ数が50に指定されているからだ。

numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)[source]

他について

細かな違いがあるので気をつけたいところ。返すarrayの要素の型についてはどちらの関数でも指定できる。しかし、arrangeint型の要素を持ったarrayを返す場合がある一方で linspaceはfloat型の要素を持つarrayを返す *3 。「少数を使うときは、linspaceが推奨らしい」という記述を見かけたが、この点を根拠として言っているのかもしれない。

*1:linspace はステップ数を返すようにするとかもできる

*2:デフォルトでは

*3:この点はよくわからなかった。つまり、linspaceは指定しない限り常にfloat型の要素を持つarrayを返すのだろうか