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 な引数が指定されてたらコピー、な形になってます。面白い。