サーチ…


丸め:ラウンド、フロア、セイル、トランケーション

ビルトインround関数に加えて、 mathモジュールはfloorceil 、および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
Python 2.x 2.7

floorceiltruncround常にfloat返します。

round(1.3)  # 1.0

round常にゼロから離れてタイを破ります。

round(0.5)  # 1.0
round(1.5)  # 2.0
Python 3.x 3.0

floorceil 、および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
Python 2.x 2.3.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です。

Python 2.x 2.6
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
Python 3.x 3.5
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()に渡すという古い構文でも機能します。

Python 3.x 3.5
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.infmath.nanも使用できます。

Python 3.x 3.5
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以降では、有限性をチェックすることもできます:

Python 3.x 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
Python 3.x 3.5
-math.nan
# Out: nan

NaNと無限の古いfloatバージョンとPython 3.5以上のmathライブラリ定数の間には微妙な違いがあります:

Python 3.x 3.5
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 cmathimport 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

組み込み関数abscomplexも言語自体の一部であり、インポートは必要ありません。

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 、複雑なバージョンがあるexploglog10 、三角関数とその逆関数( sincostanasinacosatan )、及び双曲線関数とその逆関数( sinhcoshtanhasinhacoshatanh )。しかし、 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.infmath.nan定数(Pythonの3.5以上から)

Python 3.x 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メソッドがあります。

Python 3.x 3.5
z = cmath.rect(*cmath.polar(1+1j))

z
# Out: (1.0000000000000002+1.0000000000000002j)

cmath.isclose(z, 1+1j)
# True


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow