Python Language
数学モジュール
サーチ…
丸め:ラウンド、フロア、セイル、トランケーション
ビルトインround
関数に加えて、 math
モジュールはfloor
、 ceil
、およびtrunc
関数を提供します。
x = 1.55
y = -1.55
# round to the nearest integer
round(x) # 2
round(y) # -2
# the second argument gives how many decimal places to round to (defaults to 0)
round(x, 1) # 1.6
round(y, 1) # -1.6
# math is a module so import it first, then use it.
import math
# get the largest integer less than x
math.floor(x) # 1
math.floor(y) # -2
# get the smallest integer greater than x
math.ceil(x) # 2
math.ceil(y) # -1
# drop fractional part of x
math.trunc(x) # 1, equivalent to math.floor for positive numbers
math.trunc(y) # -1, equivalent to math.ceil for negative numbers
floor
、 ceil
、 trunc
、 round
常にfloat
返します。
round(1.3) # 1.0
round
常にゼロから離れてタイを破ります。
round(0.5) # 1.0
round(1.5) # 2.0
floor
、 ceil
、およびtrunc
常にIntegral
値を返しますが、 round
は1つの引数で呼び出されるとIntegral
値を返します。
round(1.3) # 1
round(1.33, 1) # 1.3
round
ブレークは最も近い偶数に向かって結びついています。これは、多数の計算を実行するときに、より大きな数に偏って訂正します。
round(0.5) # 0
round(1.5) # 2
警告!
浮動小数点表示の場合と同様に、一部を正確に表現することはできません 。これにより、予想外の丸め動作が発生する可能性があります。
round(2.675, 2) # 2.67, not 2.68!
負の数のfloor、trunc、および整数除算に関する警告
Python(とC ++とJava)は負の数のためにゼロから丸めます。検討してください:
>>> math.floor(-1.7)
-2.0
>>> -5 // 2
-3
対数
math.log(x)
、天然(ベース与えるe
の)対数x
。
math.log(math.e) # 1.0
math.log(1) # 0.0
math.log(100) # 4.605170185988092
浮動小数点数の制限により、 math.log
精度が1に近い精度で失われる可能性があります。 1に近いログを正確に計算するには、1の自然対数と引数を評価するmath.log1p
使用します。
math.log(1 + 1e-20) # 0.0
math.log1p(1e-20) # 1e-20
math.log10
はログベース10に使用できます:
math.log10(10) # 1.0
2つの引数を指定すると、 math.log(x, base)
は与えられたbase
(つまりlog(x) / log(base)
のx
の対数をmath.log(x, base)
log(x) / log(base)
。
math.log(100, 10) # 2.0
math.log(27, 3) # 3.0
math.log(1, 10) # 0.0
記号のコピー
Python 2.6以降では、 math.copysign(x, y)
はx
の符号をy
として返します。戻り値は常にfloat
です。
math.copysign(-2, 3) # 2.0
math.copysign(3, -3) # -3.0
math.copysign(4, 14.2) # 4.0
math.copysign(1, -0.0) # -1.0, on a platform which supports signed zero
三角法
斜辺の長さの計算
math.hypot(2, 4) # Just a shorthand for SquareRoot(2**2 + 4**2)
# Out: 4.47213595499958
度をラジアンから/ラジアンに変換する
すべてのmath
関数はラジアンを必要とするため、度をラジアンに変換する必要があります。
math.radians(45) # Convert 45 degrees to radians
# Out: 0.7853981633974483
逆三角関数のすべての結果は、結果をラジアンで返します。したがって、それを度に変換する必要があります。
math.degrees(math.asin(1)) # Convert the result of asin to degrees
# Out: 90.0
正弦、余弦、正接および逆関数
# Sine and arc sine
math.sin(math.pi / 2)
# Out: 1.0
math.sin(math.radians(90)) # Sine of 90 degrees
# Out: 1.0
math.asin(1)
# Out: 1.5707963267948966 # "= pi / 2"
math.asin(1) / math.pi
# Out: 0.5
# Cosine and arc cosine:
math.cos(math.pi / 2)
# Out: 6.123233995736766e-17
# Almost zero but not exactly because "pi" is a float with limited precision!
math.acos(1)
# Out: 0.0
# Tangent and arc tangent:
math.tan(math.pi/2)
# Out: 1.633123935319537e+16
# Very large but not exactly "Inf" because "pi" is a float with limited precision
math.atan(math.inf)
# Out: 1.5707963267948966 # This is just "pi / 2"
math.atan(float('inf'))
# Out: 1.5707963267948966 # This is just "pi / 2"
math.atan
とは別に、2つの引数をmath.atan2
関数もあります。これは、正しい四分円を計算し、ゼロ除算の落とし穴を回避します。
math.atan2(1, 2) # Equivalent to "math.atan(1/2)"
# Out: 0.4636476090008061 # ≈ 26.57 degrees, 1st quadrant
math.atan2(-1, -2) # Not equal to "math.atan(-1/-2)" == "math.atan(1/2)"
# Out: -2.677945044588987 # ≈ -153.43 degrees (or 206.57 degrees), 3rd quadrant
math.atan2(1, 0) # math.atan(1/0) would raise ZeroDivisionError
# Out: 1.5707963267948966 # This is just "pi / 2"
双曲線サイン、コサイン、タンジェント
# Hyperbolic sine function
math.sinh(math.pi) # = 11.548739357257746
math.asinh(1) # = 0.8813735870195429
# Hyperbolic cosine function
math.cosh(math.pi) # = 11.591953275521519
math.acosh(1) # = 0.0
# Hyperbolic tangent function
math.tanh(math.pi) # = 0.99627207622075
math.atanh(0.5) # = 0.5493061443340549
定数
math
モジュールには、一般に使用される2つの数学定数が含まれています。
-
math.pi
- 数学定数pi -
math.e
- 数学定数e (自然対数の底)
>>> from math import pi, e
>>> pi
3.141592653589793
>>> e
2.718281828459045
>>>
Python 3.5以降では、無限大とNaN(「数ではない」)の定数があります。文字列をfloat()
に渡すという古い構文でも機能します。
math.inf == float('inf')
# Out: True
-math.inf == float('-inf')
# Out: True
# NaN never compares equal to anything, even itself
math.nan == float('nan')
# Out: False
虚数
Pythonの想像上の数字は、ターゲット番号の後ろにある "j"または "J"で表されます。
1j # Equivalent to the square root of -1.
1j * 1j # = (-1+0j)
InfinityとNaN(「数字ではない」)
Pythonのすべてのバージョンでは、次のように無限大とNaN( "not a number")を表すことができます:
pos_inf = float('inf') # positive infinity
neg_inf = float('-inf') # negative infinity
not_a_num = float('nan') # NaN ("not a number")
Python 3.5以降では、定義された定数math.inf
とmath.nan
も使用できます。
pos_inf = math.inf
neg_inf = -math.inf
not_a_num = math.nan
文字列表現はinf
と-inf
およびnan
として表示されます。
pos_inf, neg_inf, not_a_num
# Out: (inf, -inf, nan)
isinf
メソッドを使用して、正または負の無限大のいずれかをテストできます。
math.isinf(pos_inf)
# Out: True
math.isinf(neg_inf)
# Out: True
正の無限大または負の無限大を直接比較してテストすることができます。
pos_inf == float('inf') # or == math.inf in Python 3.5+
# Out: True
neg_inf == float('-inf') # or == -math.inf in Python 3.5+
# Out: True
neg_inf == pos_inf
# Out: False
Python 3.2以降では、有限性をチェックすることもできます:
math.isfinite(pos_inf)
# Out: False
math.isfinite(0.0)
# Out: True
比較演算子は、正と負の無限大に対して期待どおりに動作します。
import sys
sys.float_info.max
# Out: 1.7976931348623157e+308 (this is system-dependent)
pos_inf > sys.float_info.max
# Out: True
neg_inf < -sys.float_info.max
# Out: True
しかし、算術式がfloat
として表現できる最大値より大きい値を生成すると、無限大になります。
pos_inf == sys.float_info.max * 1.0000001
# Out: True
neg_inf == -sys.float_info.max * 1.0000001
# Out: True
しかし、ゼロ除算は無限大の結果(または適切な場合は負の無限大)をもたらさず、むしろZeroDivisionError
例外を発生させます。
try:
x = 1.0 / 0.0
print(x)
except ZeroDivisionError:
print("Division by zero")
# Out: Division by zero
無限大の算術演算は無限の結果をもたらすだけで、時にはNaN:
-5.0 * pos_inf == neg_inf
# Out: True
-5.0 * neg_inf == pos_inf
# Out: True
pos_inf * neg_inf == neg_inf
# Out: True
0.0 * pos_inf
# Out: nan
0.0 * neg_inf
# Out: nan
pos_inf / pos_inf
# Out: nan
NaNは、それ自体でさえ、何にも等しくはありません。 isnan
メソッドを使ってテストすることができます:
not_a_num == not_a_num
# Out: False
math.isnan(not_a_num)
Out: True
NaNは常に「等しくない」として比較されますが、
not_a_num != 5.0 # or any random value
# Out: True
not_a_num > 5.0 or not_a_num < 5.0 or not_a_num == 5.0
# Out: False
NaNの算術演算は常にNaNを与えます。これには、-1による乗算が含まれます。「負のNaN」はありません。
5.0 * not_a_num
# Out: nan
float('-nan')
# Out: nan
-math.nan
# Out: nan
NaNと無限の古いfloat
バージョンとPython 3.5以上のmath
ライブラリ定数の間には微妙な違いがあります:
math.inf is math.inf, math.nan is math.nan
# Out: (True, True)
float('inf') is float('inf'), float('nan') is float('nan')
# Out: (False, False)
より速い累乗のためのPow
コマンドラインからtimeitモジュールを使用する
> python -m timeit 'for x in xrange(50000): b = x**3'
10 loops, best of 3: 51.2 msec per loop
> python -m timeit 'from math import pow' 'for x in xrange(50000): b = pow(x,3)'
100 loops, best of 3: 9.15 msec per loop
組み込みの**
演算子はしばしば便利ですが、パフォーマンスが本質的である場合は、math.powを使用してください。しかし、引数が整数であっても、powの戻り値は浮動することに注意してください。
> from math import pow
> pow(5,5)
3125.0
複素数とcmathモジュール
cmath
モジュールはmath
モジュールに似ていますが、複素平面に対して適切な関数を定義しています。
まず第一に、複素数は、ライブラリクラスによって提供されるのではなく、Python言語自体の一部である数値型です。したがって、通常の算術式にimport cmath
をimport cmath
する必要はありません。
私たちが使用していることに注意してくださいj
(またはJ
)とないi
。
z = 1 + 3j
j
は数値リテラルではなく変数の名前であるため、 1j
を使用する必要があります。
1j * 1j
Out: (-1+0j)
1j ** 1j
# Out: (0.20787957635076193+0j) # "i to the i" == math.e ** -(math.pi/2)
我々は持っているreal
一部とimag
(虚数)部分だけでなく、複雑なconjugate
:
# real part and imaginary part are both float type
z.real, z.imag
# Out: (1.0, 3.0)
z.conjugate()
# Out: (1-3j) # z.conjugate() == z.real - z.imag * 1j
組み込み関数abs
とcomplex
も言語自体の一部であり、インポートは必要ありません。
abs(1 + 1j)
# Out: 1.4142135623730951 # square root of 2
complex(1)
# Out: (1+0j)
complex(imag=1)
# Out: (1j)
complex(1, 1)
# Out: (1+1j)
complex
関数は文字列を取ることができますが、空白を持つことはできません:
complex('1+1j')
# Out: (1+1j)
complex('1 + 1j')
# Exception: ValueError: complex() arg is a malformed string
しかし、ほとんどの関数では、 sqrt
モジュールが必要です。
import cmath
cmath.sqrt(-1)
# Out: 1j
当然sqrt
の動作は複素数と実数では異なります。非複雑なmath
では、負の数の平方根は例外を発生させます。
import math
math.sqrt(-1)
# Exception: ValueError: math domain error
極座標に変換する関数と極座標から変換する関数が用意されています。
cmath.polar(1 + 1j)
# Out: (1.4142135623730951, 0.7853981633974483) # == (sqrt(1 + 1), atan2(1, 1))
abs(1 + 1j), cmath.phase(1 + 1j)
# Out: (1.4142135623730951, 0.7853981633974483) # same as previous calculation
cmath.rect(math.sqrt(2), math.atan(1))
# Out: (1.0000000000000002+1.0000000000000002j)
複雑な解析の数学的な分野はこの例の範囲を超えていますが、複雑な平面の多くの関数は、通常は実軸または虚軸に沿った「分岐カット」を持っています。最新のプラットフォームでは、IEEE 754で規定されている「符号付きゼロ」がサポートされています。これにより、ブランチカットの両側でこれらの関数の連続性が提供されます。次の例は、Pythonのドキュメントです。
cmath.phase(complex(-1.0, 0.0))
# Out: 3.141592653589793
cmath.phase(complex(-1.0, -0.0))
# Out: -3.141592653589793
cmath
モジュールはまた、 math
モジュールからの直接的な対応を持つ多くの関数を提供します。
加えてsqrt
、複雑なバージョンがあるexp
、 log
、 log10
、三角関数とその逆関数( sin
、 cos
、 tan
、 asin
、 acos
、 atan
)、及び双曲線関数とその逆関数( sinh
、 cosh
、 tanh
、 asinh
、 acosh
、 atanh
)。しかし、 math.atan2
の2つの引数をとる形式のmath.atan2
の複雑な対応はありません。
cmath.log(1+1j)
# Out: (0.34657359027997264+0.7853981633974483j)
cmath.exp(1j * cmath.pi)
# Out: (-1+1.2246467991473532e-16j) # e to the i pi == -1, within rounding error
定数pi
およびe
が提供される。これらはfloat
でありcomplex
ではないことに注意してください。
type(cmath.pi)
# Out: <class 'float'>
cmath
モジュールは、 isinf
複雑なバージョンと(Python 3.2以降の) isfinite
も提供します。 「 InfinityとNaN 」を参照してください。複素数は、その実部または虚部のいずれかが無限である場合、無限とみなされます。
cmath.isinf(complex(float('inf'), 0.0))
# Out: True
同様に、 cmath
モジュールはisnan
複雑なバージョンを提供します。 「 InfinityとNaN 」を参照してください。複素数は、その実数部または虚数部のいずれかが「数ではない」場合、「数ではない」とみなされます。
cmath.isnan(0.0, float('nan'))
# Out: True
全く存在しない注cmath
の対応math.inf
とmath.nan
定数(Pythonの3.5以上から)
cmath.isinf(complex(0.0, math.inf))
# Out: True
cmath.isnan(complex(math.nan, 0.0))
# Out: True
cmath.inf
# Exception: AttributeError: module 'cmath' has no attribute 'inf'
Python 3.5以降では、 cmath
モジュールとmath
モジュールの両方にisclose
メソッドがあります。
z = cmath.rect(*cmath.polar(1+1j))
z
# Out: (1.0000000000000002+1.0000000000000002j)
cmath.isclose(z, 1+1j)
# True