7章学習記録 » 履歴 » バージョン 1
Tatsuya ISHIGAKI, 2025/07/01 14:19
| 1 | 1 | Tatsuya ISHIGAKI | # 第7章 数値の処理 (試験範囲外) |
|---|---|---|---|
| 2 | ## 7.1 基本的な計算を行う 組み込み関数,math |
||
| 3 | - 組み込み関数 |
||
| 4 | |関数名|解説|戻り値| |
||
| 5 | |---|---|---| |
||
| 6 | |`abs(x)`|x の絶対値|int, fload など| |
||
| 7 | |`max(arg1, arg2, *args[, key])`|2つ以上の引数のなかで最大の値|int, float など| |
||
| 8 | |`max(iterable, *[, key, default])`|iterable のなかで最大の値|int, float など| |
||
| 9 | |`min(arg1, arg2, args*[, key])`|2つ以上の引数のなかで最小の値|int, float など| |
||
| 10 | |`min(iterable, *[, key, default])`|iterable のなかで最小の値|int, float など| |
||
| 11 | |`sum(iterable, /, start=0)`|iterable に指定される数値の総和<br>start が指定された場合、その数値も加算|int, float など| |
||
| 12 | |`pow(x, y[, z])`|x の y 乗<br>z が指定された場合は、べき乗結果を z で除算した余り|int, float など| |
||
| 13 | |||
| 14 | - math モジュール |
||
| 15 | - 代表関数 |
||
| 16 | |関数名|解説|戻り値| |
||
| 17 | |---|---|---| |
||
| 18 | |`prod(iterable, *, start=1)`|iterable の全要素の積|int, float など| |
||
| 19 | |`gcd(*integers)`|整数引数の最大公約数|int| |
||
| 20 | |`log(x[, base])`|x の対数 (底:e)<br>base 指定の場合は、底:base|float| |
||
| 21 | |`log10(x)`|x の対数 (底:10)|float| |
||
| 22 | |`log2(x)`|x の対数 (底:2)|float| |
||
| 23 | |`pow(x, y)`|x の y 乗|float| |
||
| 24 | |`sqrt(x)`|x の平方根|float| |
||
| 25 | |`radians(x)`|x 度をラジアンに変換|float| |
||
| 26 | |`sin(x)`|ラジアン x の正弦|float| |
||
| 27 | |`cos(x)`|ラジアン x の余弦|float| |
||
| 28 | |`tan(x)`|ラジアン x の正接|float| |
||
| 29 | |||
| 30 | - 丸め、絶対値 |
||
| 31 | |関数名|解説|戻り値| |
||
| 32 | |---|---|---| |
||
| 33 | |`ceil(x)`|天井関数: 浮動小数点型 x 以上の最小の整数|int| |
||
| 34 | |`floor(x)`|床関数: 浮動小数点型 x 以下の最大の整数|int| |
||
| 35 | |`trunc(x)`|浮動小数点型 x の小数点以下を切り捨て|int| |
||
| 36 | |`fabs(x)`|x の絶対値 (`abs(x)` と異なり、複素数は不可)|float| |
||
| 37 | |||
| 38 | - 定数 |
||
| 39 | |定数|解説|型| |
||
| 40 | |---|---|---| |
||
| 41 | |`pi`|円周率 π|float| |
||
| 42 | |`e`|自然対数の底 (ネイピア数)|float| |
||
| 43 | |`tau`|2π|float| |
||
| 44 | |`inf`|浮動小数の正の無限大 (負の無限大には `-math.inf` を使用)|float| |
||
| 45 | |`nan`|浮動小数の非数 NaN (Not a Number)|float| |
||
| 46 | |||
| 47 | - 演算子 `**`、組み込み `pow()`、`math.pow()` |
||
| 48 | - `math.pow()` は、結果を必ず float へキャストする |
||
| 49 | - 演算子と組み込み `pow()` は、整数引数のみの場合はキャストしない |
||
| 50 | - 整数演算なら、演算子か組み込み `pow()` が誤差無く結果取得できる |
||
| 51 | - 非数 `NaN` の確認には関数 `math.isnan()` を使用 |
||
| 52 | ```python |
||
| 53 | >>> import math |
||
| 54 | >>> a = math.nan |
||
| 55 | >>> a == math.nan |
||
| 56 | False |
||
| 57 | >>> math.isnan(a) |
||
| 58 | True |
||
| 59 | ``` |
||
| 60 | |||
| 61 | ## 7.2 十進数で計算を行う decimal |
||
| 62 | - 十進数の計算に使用するモジュールで、以下の様なことができるため、厳密な精度規則がある金額計算などで使用される |
||
| 63 | - 有効桁数の指定 |
||
| 64 | - 丸め、四捨五入 |
||
| 65 | - `Decimal` クラス |
||
| 66 | - `Decimal(value='0', context=None)` |
||
| 67 | - `value` 数値 |
||
| 68 | - `context` 算術コンテキスト |
||
| 69 | ```python |
||
| 70 | >>> from decimal import Decimal |
||
| 71 | >>> Decimal(3.14) |
||
| 72 | Decimal('3.140000000000000124344978758017532527446746826171875') |
||
| 73 | >>> Decimal('3.14') |
||
| 74 | Decimal('3.14') |
||
| 75 | >>> Decimal((0, (1, 4, 1, 4, 2), -4)) # (引数全体がタプルの場合) 0:符号(1は負数), タプル:数字, -4:指数 |
||
| 76 | Decimal('1.4142') |
||
| 77 | >>> Decimal('NaN') # 非数 |
||
| 78 | Decimal('NaN') |
||
| 79 | >>> Decimal('Infinity') # 正の無限大 |
||
| 80 | Decimal('Infinity') |
||
| 81 | >>> Decimal('-Infinity') # 負の無限大 |
||
| 82 | Decimal('-Infinity') |
||
| 83 | ``` |
||
| 84 | - 演算子はそのまま使用可能 |
||
| 85 | ```python |
||
| 86 | >>> from decimal import Decimal |
||
| 87 | >>> Decimal('2.4') - Decimal('1.1') |
||
| 88 | Decimal('1.3') |
||
| 89 | >>> Decimal('1.02') * Decimal('2.5') |
||
| 90 | Decimal('2.550') |
||
| 91 | ``` |
||
| 92 | - 精度の指定 |
||
| 93 | - 算術コンテキストで精度を指定する |
||
| 94 | ```python |
||
| 95 | >>> from decimal import Decimal, getcontext |
||
| 96 | >>> Decimal('1') / Decimal('7') |
||
| 97 | Decimal('0.1428571428571428571428571429') # デフォルトでは有効桁数 28 桁 |
||
| 98 | >>> getcontext().prec = 7 # 現在の算術コンテキストの有効桁数を 7 桁に設定 |
||
| 99 | >>> Decimal('1') / Decimal('7') |
||
| 100 | Decimal('0.1428571') |
||
| 101 | >>> Decimal('1') / Decimal('3') |
||
| 102 | Decimal('0.3333333') |
||
| 103 | ``` |
||
| 104 | - 数値の丸め |
||
| 105 | - `Decimal.quantize(exp, rounding=None, context=None)` |
||
| 106 | - `exp` 精度を指定する Decimal オブジェクト |
||
| 107 | - `rounding` 丸め方法 |
||
| 108 | - `context` 算術コンテキスト |
||
| 109 | ```python |
||
| 110 | >>> from decimal import Decimal |
||
| 111 | >>> rt2 = Decimal('1.41421356') |
||
| 112 | >>> rt2 |
||
| 113 | Decimal('1.41421356') |
||
| 114 | >>> rt2.quantize(Decimal('1.00')) # 小数部2桁 |
||
| 115 | Decimal('1.41') |
||
| 116 | >>> rt2.quantize(Decimal('10.00')) # 小数部2桁 |
||
| 117 | Decimal('1.41') |
||
| 118 | >>> rt2.quantize(Decimal('0.00')) # 小数部2桁 |
||
| 119 | Decimal('1.41') |
||
| 120 | >>> rt2.quantize(Decimal('0.000')) # 小数部3桁 |
||
| 121 | Decimal('1.414') |
||
| 122 | >>> from decimal import Decimal, ROUND_UP, ROUND_DOWN |
||
| 123 | >>> rt2.quantize(Decimal('0.000'), ROUND_UP) # 切り上げ |
||
| 124 | Decimal('1.415') |
||
| 125 | >>> rt2.quantize(Decimal('0.000'), ROUND_DOWN) # 切り捨て |
||
| 126 | Decimal('1.414') |
||
| 127 | ``` |
||
| 128 | |rounding|解説|1.04|1.05|-1.05| |
||
| 129 | |---|---|---|---|---| |
||
| 130 | |ROUND_UP |切り上げ|1.1|1.1|-1.1| |
||
| 131 | |ROUND_DOWN |切り捨て|1.0|1.0|-1.0| |
||
| 132 | |ROUND_CEILING |正の無限大方向丸め|1.1|1.1|-1.0| |
||
| 133 | |ROUND_FLOOR |負の無限大方向丸め|1.0|1.0|-1.1| |
||
| 134 | |ROUND_HALF_UP |四捨五入|1.0|1.1|-1.1| |
||
| 135 | |ROUND_HALF_DOWN|五捨六入|1.0|1.0|-1.0| |
||
| 136 | |ROUND_HALF_EVEN|上位1桁が奇数の場合、四捨五入<br>そうでない場合、五捨六入|1.0|1.0|-1.0| |
||
| 137 | |ROUND_05UP |上位1桁が0または5の場合、切り上げ<br>そうでない場合、切り捨て|1.1|1.1|-1.1| |
||
| 138 | - decimal 使われ方 |
||
| 139 | - float を使用すると、内部で2進数表現されることで厳密な十進数が扱えないため decimal を使用する |
||
| 140 | - decimal 注意点 |
||
| 141 | - Decimal オブジェクト作成時に数値指定することは可能だが、十進数としてはずれが生じる |
||
| 142 | - 2進数の数値として解決してから十進数変換するため |
||
| 143 | - Decimal オブジェクトを十進数として扱う場合は文字列指定するべき |
||
| 144 | |||
| 145 | ## 7.3 議事乱数を使う random |
||
| 146 | - 乱数生成を行う関数 |
||
| 147 | |関数名|解説|戻り値| |
||
| 148 | |---|---|---| |
||
| 149 | |`random()`|0.0 以上 1.0 未満の float を取得|float| |
||
| 150 | |`randint(x, y)`|x 以上 y 以下の整数を取得<br>float 指定すると ValueError|int| |
||
| 151 | |`uniform(x, y)`|x 以上 y 以下 (x > y の場合は y 以上 x 以下) の数値を取得|float| |
||
| 152 | |||
| 153 | - 実験、テストなどで再現性が必要な場合は、`random.seed()` を使う |
||
| 154 | ```python |
||
| 155 | >>> import random |
||
| 156 | >>> random.seed(8) |
||
| 157 | >>> random.random() |
||
| 158 | 0.2267058593810488 |
||
| 159 | >>> random.seed(8) |
||
| 160 | >>> random.random() |
||
| 161 | 0.2267058593810488 # 1回目と同じ値 |
||
| 162 | >>> random.random() |
||
| 163 | 0.9622950358343828 |
||
| 164 | ``` |
||
| 165 | |||
| 166 | - 特定分布に従う乱数生成 |
||
| 167 | |関数名|解説|戻り値| |
||
| 168 | |---|---|---| |
||
| 169 | |`nomalvariate(mu, sigma)`|平均 mu, 標準偏差 sigma の正規分布に基づく乱数生成|float| |
||
| 170 | |`gammavariate(k, theta)`|形状母数 k, 尺度母数 theta のガンマ分布に基づく乱数生成|float| |
||
| 171 | |||
| 172 | - ランダムに選択する |
||
| 173 | |関数名|解説|戻り値| |
||
| 174 | |---|---|---| |
||
| 175 | |`choice(seq)`|シーケンス seq の要素を1つ返す|シーケンス内の要素| |
||
| 176 | |`choices(population, weights=None, *, cum_weights=None, k=1)`|population から重複ありで選んだ大きさ k のリストを返す<br>weight, cum_weights は重みづけに使用|リスト| |
||
| 177 | |`sample(population, k, *, counts=None)`|母集団 population から k このサンプルを取得してリストを返す<br>重複あり母集団は counts を用いても指定可能 (詳細略)<br>k は 母集団の大きさ以下|リスト| |
||
| 178 | |`shuffle(seq)`|シーケンス seq の要素の順番をシャッフルする|なし| |
||
| 179 | |||
| 180 | ```python |
||
| 181 | >>> num_list = [1, 2, 3, 4, 5] |
||
| 182 | >>> random.choice(num_list) # シーケンスの要素をランダムに1つ選択 |
||
| 183 | 2 |
||
| 184 | >>> random.choice(num_list) |
||
| 185 | 5 |
||
| 186 | >>> random.choices([1, 2, 3], k=6) |
||
| 187 | [3, 2, 2, 3, 2, 1] |
||
| 188 | >>> random.sample(num_list, 2) # シーケンスの要素から、第2引数の数のリストを新たに生成する |
||
| 189 | [3, 1] |
||
| 190 | >>> random.shuffle(num_list) # shuffle()はもとのシーケンスの要素の順序を変更する |
||
| 191 | >>> num_list |
||
| 192 | [3, 1, 4, 5, 2] |
||
| 193 | ``` |
||
| 194 | |||
| 195 | ## 7.4 統計計算を行う statistics |
||
| 196 | - 平均値や中央値 |
||
| 197 | (下記の `data` には、int, float, Decimal, Fraction からなるシーケンスまたはイテラブルを指定) |
||
| 198 | |関数名|解説|戻り値| |
||
| 199 | |---|---|---| |
||
| 200 | |`mean(data)`|平均値を求める|int, float, Decimal, Fraction| |
||
| 201 | |`geometric_mean(data)`|data を float に変換し、幾何平均を求める|float| |
||
| 202 | |`harmonic_mean(data)`|調和平均を求める|int, float, Decimal, Fraction| |
||
| 203 | |`median(data)`|中央値を求める|int, float, Decimal, Fraction| |
||
| 204 | |`mode(data)`|最頻値を求める|int, float, Decimal, Fraction| |
||
| 205 | |`quantiles(data, *, n=4, method='exclusive')`|分位数を求める|n-1 個の分位数のリスト| |
||
| 206 | |||
| 207 | ```python |
||
| 208 | >>> import statistics |
||
| 209 | >>> from decimal import Decimal |
||
| 210 | >>> data = [1, 2, 2, 3, 4, 5, 6] |
||
| 211 | >>> statistics.mean(data) |
||
| 212 | 3.2857142857142856 |
||
| 213 | >>> statistics.geometric_mean(data) |
||
| 214 | 2.8261463109481344 |
||
| 215 | >>> statistics.harmonic_mean(data) |
||
| 216 | 2.3728813559322033 |
||
| 217 | >>> statistics.median(data) |
||
| 218 | 3 |
||
| 219 | >>> statistics.mode(data) |
||
| 220 | 2 |
||
| 221 | >>> statistics.quantiles(data, n=5) |
||
| 222 | [1.6, 2.2, 3.8, 5.4] |
||
| 223 | >>> statistics.mean((Decimal("0.5"), Decimal("0.75"), Decimal("0.43"))) # タプルで渡す |
||
| 224 | Decimal('0.56') |
||
| 225 | >>> statistics.mean(i ** 2 for i in range(1000)) # ジェネレーター式で渡す |
||
| 226 | 332833.5 |
||
| 227 | ``` |
||
| 228 | |||
| 229 | - 標準偏差や分散 |
||
| 230 | |関数名|解説|戻り値| |
||
| 231 | |---|---|--- |
||
| 232 | |`pvariance(data)`|data の分散を求める|float| |
||
| 233 | |`pstdev(data)`|data の標準偏差を求める|float| |
||
| 234 | |`variance(data)`|data を標本とする母集団の分散の不変推定量を求める|float| |
||
| 235 | |`stdev(data)`|variance(data) の平方根を求める|float| |
||
| 236 | |||
| 237 | ```python |
||
| 238 | >>> import statistics |
||
| 239 | >>> data = [1, 2, 2, 3, 4, 5, 6] |
||
| 240 | >>> statistics.pstdev(data) |
||
| 241 | 1.665986255670086 |
||
| 242 | >>> statistics.stdev(data) |
||
| 243 | 1.799470821684875 |
||
| 244 | >>> statistics.pvariance(data) |
||
| 245 | 2.775510204081633 |
||
| 246 | >>> statistics.variance(data) |
||
| 247 | 3.2380952380952386 |
||
| 248 | ``` |