プロジェクト

全般

プロフィール

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
  ```