操作
第7章 数値の処理 (試験範囲外)¶
7.1 基本的な計算を行う 組み込み関数,math¶
-
組み込み関数
関数名 解説 戻り値 abs(x)x の絶対値 int, fload など max(arg1, arg2, *args[, key])2つ以上の引数のなかで最大の値 int, float など max(iterable, *[, key, default])iterable のなかで最大の値 int, float など min(arg1, arg2, args*[, key])2つ以上の引数のなかで最小の値 int, float など min(iterable, *[, key, default])iterable のなかで最小の値 int, float など sum(iterable, /, start=0)iterable に指定される数値の総和
start が指定された場合、その数値も加算int, float など pow(x, y[, z])x の y 乗
z が指定された場合は、べき乗結果を z で除算した余りint, float など -
math モジュール
-
代表関数
関数名 解説 戻り値 prod(iterable, *, start=1)iterable の全要素の積 int, float など gcd(*integers)整数引数の最大公約数 int log(x[, base])x の対数 (底:e)
base 指定の場合は、底:basefloat log10(x)x の対数 (底:10) float log2(x)x の対数 (底:2) float pow(x, y)x の y 乗 float sqrt(x)x の平方根 float radians(x)x 度をラジアンに変換 float sin(x)ラジアン x の正弦 float cos(x)ラジアン x の余弦 float tan(x)ラジアン x の正接 float -
丸め、絶対値
関数名 解説 戻り値 ceil(x)天井関数: 浮動小数点型 x 以上の最小の整数 int floor(x)床関数: 浮動小数点型 x 以下の最大の整数 int trunc(x)浮動小数点型 x の小数点以下を切り捨て int fabs(x)x の絶対値 ( abs(x)と異なり、複素数は不可)float -
定数
定数 解説 型 pi円周率 π float e自然対数の底 (ネイピア数) float tau2π float inf浮動小数の正の無限大 (負の無限大には -math.infを使用)float nan浮動小数の非数 NaN (Not a Number) float -
演算子
**、組み込みpow()、math.pow()-
math.pow()は、結果を必ず float へキャストする - 演算子と組み込み
pow()は、整数引数のみの場合はキャストしない - 整数演算なら、演算子か組み込み
pow()が誤差無く結果取得できる
-
-
非数
NaNの確認には関数math.isnan()を使用>>> import math >>> a = math.nan >>> a == math.nan False >>> math.isnan(a) True
-
7.2 十進数で計算を行う decimal¶
- 十進数の計算に使用するモジュールで、以下の様なことができるため、厳密な精度規則がある金額計算などで使用される
- 有効桁数の指定
- 丸め、四捨五入
-
Decimalクラス-
Decimal(value='0', context=None)-
value数値 -
context算術コンテキスト
>>> from decimal import Decimal >>> Decimal(3.14) Decimal('3.140000000000000124344978758017532527446746826171875') >>> Decimal('3.14') Decimal('3.14') >>> Decimal((0, (1, 4, 1, 4, 2), -4)) # (引数全体がタプルの場合) 0:符号(1は負数), タプル:数字, -4:指数 Decimal('1.4142') >>> Decimal('NaN') # 非数 Decimal('NaN') >>> Decimal('Infinity') # 正の無限大 Decimal('Infinity') >>> Decimal('-Infinity') # 負の無限大 Decimal('-Infinity') -
- 演算子はそのまま使用可能
>>> from decimal import Decimal >>> Decimal('2.4') - Decimal('1.1') Decimal('1.3') >>> Decimal('1.02') * Decimal('2.5') Decimal('2.550') - 精度の指定
- 算術コンテキストで精度を指定する
>>> from decimal import Decimal, getcontext >>> Decimal('1') / Decimal('7') Decimal('0.1428571428571428571428571429') # デフォルトでは有効桁数 28 桁 >>> getcontext().prec = 7 # 現在の算術コンテキストの有効桁数を 7 桁に設定 >>> Decimal('1') / Decimal('7') Decimal('0.1428571') >>> Decimal('1') / Decimal('3') Decimal('0.3333333')
- 算術コンテキストで精度を指定する
- 数値の丸め
-
Decimal.quantize(exp, rounding=None, context=None)-
exp精度を指定する Decimal オブジェクト -
rounding丸め方法 -
context算術コンテキスト
>>> from decimal import Decimal >>> rt2 = Decimal('1.41421356') >>> rt2 Decimal('1.41421356') >>> rt2.quantize(Decimal('1.00')) # 小数部2桁 Decimal('1.41') >>> rt2.quantize(Decimal('10.00')) # 小数部2桁 Decimal('1.41') >>> rt2.quantize(Decimal('0.00')) # 小数部2桁 Decimal('1.41') >>> rt2.quantize(Decimal('0.000')) # 小数部3桁 Decimal('1.414') >>> from decimal import Decimal, ROUND_UP, ROUND_DOWN >>> rt2.quantize(Decimal('0.000'), ROUND_UP) # 切り上げ Decimal('1.415') >>> rt2.quantize(Decimal('0.000'), ROUND_DOWN) # 切り捨て Decimal('1.414') -
rounding 解説 1.04 1.05 -1.05 ROUND_UP 切り上げ 1.1 1.1 -1.1 ROUND_DOWN 切り捨て 1.0 1.0 -1.0 ROUND_CEILING 正の無限大方向丸め 1.1 1.1 -1.0 ROUND_FLOOR 負の無限大方向丸め 1.0 1.0 -1.1 ROUND_HALF_UP 四捨五入 1.0 1.1 -1.1 ROUND_HALF_DOWN 五捨六入 1.0 1.0 -1.0 ROUND_HALF_EVEN 上位1桁が奇数の場合、四捨五入
そうでない場合、五捨六入1.0 1.0 -1.0 ROUND_05UP 上位1桁が0または5の場合、切り上げ
そうでない場合、切り捨て1.1 1.1 -1.1 -
-
- decimal 使われ方
- float を使用すると、内部で2進数表現されることで厳密な十進数が扱えないため decimal を使用する
- decimal 注意点
- Decimal オブジェクト作成時に数値指定することは可能だが、十進数としてはずれが生じる
- 2進数の数値として解決してから十進数変換するため
- Decimal オブジェクトを十進数として扱う場合は文字列指定するべき
- Decimal オブジェクト作成時に数値指定することは可能だが、十進数としてはずれが生じる
7.3 議事乱数を使う random¶
-
乱数生成を行う関数
関数名 解説 戻り値 random()0.0 以上 1.0 未満の float を取得 float randint(x, y)x 以上 y 以下の整数を取得
float 指定すると ValueErrorint uniform(x, y)x 以上 y 以下 (x > y の場合は y 以上 x 以下) の数値を取得 float - 実験、テストなどで再現性が必要な場合は、
random.seed()を使う>>> import random >>> random.seed(8) >>> random.random() 0.2267058593810488 >>> random.seed(8) >>> random.random() 0.2267058593810488 # 1回目と同じ値 >>> random.random() 0.9622950358343828
- 実験、テストなどで再現性が必要な場合は、
-
特定分布に従う乱数生成
関数名 解説 戻り値 nomalvariate(mu, sigma)平均 mu, 標準偏差 sigma の正規分布に基づく乱数生成 float gammavariate(k, theta)形状母数 k, 尺度母数 theta のガンマ分布に基づく乱数生成 float -
ランダムに選択する
関数名 解説 戻り値 choice(seq)シーケンス seq の要素を1つ返す シーケンス内の要素 choices(population, weights=None, *, cum_weights=None, k=1)population から重複ありで選んだ大きさ k のリストを返す
weight, cum_weights は重みづけに使用リスト sample(population, k, *, counts=None)母集団 population から k このサンプルを取得してリストを返す
重複あり母集団は counts を用いても指定可能 (詳細略)
k は 母集団の大きさ以下リスト shuffle(seq)シーケンス seq の要素の順番をシャッフルする なし >>> num_list = [1, 2, 3, 4, 5] >>> random.choice(num_list) # シーケンスの要素をランダムに1つ選択 2 >>> random.choice(num_list) 5 >>> random.choices([1, 2, 3], k=6) [3, 2, 2, 3, 2, 1] >>> random.sample(num_list, 2) # シーケンスの要素から、第2引数の数のリストを新たに生成する [3, 1] >>> random.shuffle(num_list) # shuffle()はもとのシーケンスの要素の順序を変更する >>> num_list [3, 1, 4, 5, 2]
7.4 統計計算を行う statistics¶
-
平均値や中央値
(下記のdataには、int, float, Decimal, Fraction からなるシーケンスまたはイテラブルを指定)関数名 解説 戻り値 mean(data)平均値を求める int, float, Decimal, Fraction geometric_mean(data)data を float に変換し、幾何平均を求める float harmonic_mean(data)調和平均を求める int, float, Decimal, Fraction median(data)中央値を求める int, float, Decimal, Fraction mode(data)最頻値を求める int, float, Decimal, Fraction quantiles(data, *, n=4, method='exclusive')分位数を求める n-1 個の分位数のリスト >>> import statistics >>> from decimal import Decimal >>> data = [1, 2, 2, 3, 4, 5, 6] >>> statistics.mean(data) 3.2857142857142856 >>> statistics.geometric_mean(data) 2.8261463109481344 >>> statistics.harmonic_mean(data) 2.3728813559322033 >>> statistics.median(data) 3 >>> statistics.mode(data) 2 >>> statistics.quantiles(data, n=5) [1.6, 2.2, 3.8, 5.4] >>> statistics.mean((Decimal("0.5"), Decimal("0.75"), Decimal("0.43"))) # タプルで渡す Decimal('0.56') >>> statistics.mean(i ** 2 for i in range(1000)) # ジェネレーター式で渡す 332833.5 -
標準偏差や分散
関数名 解説 戻り値 pvariance(data)data の分散を求める float pstdev(data)data の標準偏差を求める float variance(data)data を標本とする母集団の分散の不変推定量を求める float stdev(data)variance(data) の平方根を求める float >>> import statistics >>> data = [1, 2, 2, 3, 4, 5, 6] >>> statistics.pstdev(data) 1.665986255670086 >>> statistics.stdev(data) 1.799470821684875 >>> statistics.pvariance(data) 2.775510204081633 >>> statistics.variance(data) 3.2380952380952386
Tatsuya ISHIGAKI さんが5ヶ月前に更新 · 1件の履歴