NumPy np.inf
との違いはありfloat('Inf')
ますか?float('Inf') == np.inf
を返すTrue
ので、それらは交換可能であるように思われます。したがって、NumPyが独自の「inf」定数を定義した理由と、スタイルの懸念を考慮して、いつ1つの定数を他の定数の代わりに使用する必要があるのか疑問に思いましたか?
math.inf
andと同じ値を持つことに加えてfloat('inf')
:
>>> import math
>>> import numpy as np
>>> np.inf == float('inf')
True
>>> np.inf == math.inf
True
また、同じタイプです。
>>> import numpy as np
>>> type(np.inf)
float
>>> type(np.inf) is type(float('inf'))
float
NumPyにも独自の浮動小数点型があるため、これは興味深いです。
>>> np.float32(np.inf)
inf
>>> type(np.float32(np.inf))
numpy.float32
>>> np.float32('inf') == np.inf # nevertheless equal
True
それは同じ値と同じ型を持つようにmath.inf
し、float('inf')
それは交換可能です意味しています。
np.inf
入力する手間が省けます:
np.inf
(6文字) math.inf
(8文字; Python 3.5の新機能)float('inf')
(12文字) つまり、すでにNumPyをインポートしている場合は、float('inf')
(またはmath.inf
)と比較して、発生ごとに6(または2)文字を節約できます。
覚えやすいから。
少なくとも私にとっては、文字列でnp.inf
呼び出す必要があるよりも覚えやすいfloat
です。
また、NumPyは、無限大の追加のエイリアスもいくつか定義しています。
np.Inf
np.inf
np.infty
np.Infinity
np.PINF
また、負の無限大のエイリアスも定義します。
np.NINF
同様にnan
:
np.nan
np.NaN
np.NAN
定数は定数です
この点はCPythonに基づいており、別のPython実装では完全に異なる可能性があります。
float
CPythonのインスタンスは、24バイトが必要です。
>>> import sys
>>> sys.getsizeof(np.inf)
24
同じインスタンスを再利用できる場合、新しいインスタンスを大量に作成する場合と比較して、多くのメモリを節約できる可能性があります。もちろん、この点は、独自のinf
定数を作成する場合はミュートですが、作成しない場合:
a = [np.inf for _ in range(1000000)]
b = [float('inf') for _ in range(1000000)]
b
は、24 * 1000000バイト(約23 MB)より多くのメモリを使用しa
ます。
定数へのアクセスは、変数の作成よりも高速です。
%timeit np.inf
37.9 ns ± 0.692 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
%timeit float('inf')
232 ns ± 13.9 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%timeit [np.inf for _ in range(10000)]
552 µs ± 15.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit [float('inf') for _ in range(10000)]
2.59 ms ± 78.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
もちろん、その点に対抗するために独自の定数を作成できます。しかし、なぜNumPyがすでにそれを行っているのか気になります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加