Pmf.py 確認

後天性記憶不全なので、という訳でもないのですが確認。
Pmf.py の中では _DictWrapper というクラスとそれを継承する Hist と Pmf というクラスが定義されてます。Hist はヒストグラムPmf は正規化されたヒストグラム (PMF) を表現ものになってます。
で、内部的には属性として辞書を持ってるんですが、

  • Hist は値を整数の頻度にマップ
  • Pmf は値を不動少数点数への確率にマップ

という事が一番大きな違い、とテキストにはありますね。これを踏まえて中身確認を。

まず _DictWrapper から

コンストラクタが以下。

class _DictWrapper(object):
    """An object that contains a dictionary."""

    def __init__(self, d=None, name=''):
        # if d is provided, use it; otherwise make a new dict
        if d == None:
            d = {}
        self.d = d
        self.name = name

辞書 d と名前 name を属性として保持してます。続いて getter メソド。コメントは除いています。

    def GetDict(self):
        return self.d

    def Values(self):
        return self.d.keys()

    def Items(self):
        return self.d.items()

辞書の keys は共通して値を持っていますが、values はクラスによって意味が異なるので superclass ではメソド未定義なのかな。
次に定義されてる Render メソドは並びかえた key : value の key のリストと value なリストのリストを戻す模様。

    def Render(self):
        return zip(*sorted(self.Items()))

Print も Python 的。

    def Print(self):
        for val, prob in sorted(self.d.iteritems()):
            print val, prob

Set は value の setter メソドですね。

    def Set(self, x, y=0):
        self.d[x] = y

Incr や Mult は属性の値を設定するメソドなのか。

    def Incr(self, x, term=1):
        self.d[x] = self.d.get(x, 0) + term

    def Mult(self, x, factor):
        self.d[x] = self.d.get(x, 0) * factor

ちなみに self.d.get(x, 0) は key が x な value が無かった場合には 0 を戻します。Remove はそのまんまなので略。Total とか MaxLike とかも Python てきなのかどうか。

    def Total(self):
        total = sum(self.d.itervalues())
        return total

    def MaxLike(self):
        return max(self.d.itervalues())

辞書.itervalues() の戻りを渡す、というあたり、リストが好きな人には見易いですね。

続きを云々したら

追記の方向。とりあえずエントリ投入。

某アプリ

スデに手を離れましたので、こちらへ。superclass で用意されてる操作は上で確認した通り、以下。

  • オブジェクト生成
  • GetDict (オブジェクト属性の辞書の取得)
  • Values (オブジェクト属性の辞書のキーの取得)
  • Items (オブジェクト属性の辞書のキーと値のタプルのリストの取得)
  • Render (オブジェクト属性の辞書をキー順に並べてキーと値のリストのタプル (?) 取得)
  • Print (オブジェクト属性の辞書を print)
  • Set (オブジェクト属性の辞書に値を設定)
  • Incr (オブジェクト属性の辞書に値を加算)
  • Mult (オブジェクト属性の辞書に値を乗算)
  • Remove (オブジェクト属性の辞書から要素を削除)
  • Total (オブジェクト属性の辞書の値の合計)
  • MaxLike (オブジェクト属性の辞書の値の最大値)

Hist クラス

用意されてる操作を列挙しておきます。名前のみ。

  • Copy
  • Freq
  • Freqs
  • IsSubset
  • Subtract

ふむ、値を取り出すメソドの名前が Hist と Pmf では違うのですね。む、Python てデフォルト引数使うことでコピーコンストラクタも兼ねるとかなナニが実現できるんですね。
以下、Hist#Copy の記述の一部なんですが

        return Hist(dict(self.d), name)

_DictWrapper のコンストラクタの記述が以下で

    def __init__(self, d=None, name=''):
        # if d is provided, use it; otherwise make a new dict
        if d == None:
            d = {}
        self.d = d

d な引数が指定されてたらコピー、な形になってます。面白い。