プロジェクト

全般

プロフィール

操作

第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 指定の場合は、底:base
      float
      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
      tau 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 オブジェクトを十進数として扱う場合は文字列指定するべき

7.3 議事乱数を使う random

  • 乱数生成を行う関数

    関数名 解説 戻り値
    random() 0.0 以上 1.0 未満の float を取得 float
    randint(x, y) x 以上 y 以下の整数を取得
    float 指定すると ValueError
    int
    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件の履歴