pythonモジュールのバージョンは

pythonモジュールのバージョンってどうやって調べるんだろうとか。
versionとかいう属性に統一されてると思ったんだけどそういうわけでもないのね。

>>> import rpy
>>> import re
>>> [x for x in dir(rpy) if re.search('version',x)]
['rpy_version']
>>> rpy.rpy_version
'0.4.6'
>>> import SOAPpy
>>> [x for x in dir(SOAPpy) if re.search('version',x)]
['__version__', 'version']
>>> SOAPpy.__version__
'0.11.6'

あと正規表現もモジュール読み込まないといけないのね。

追記

あ、別に正規表現使わなくてもfindでもいいのか。

>>> [x for x in dir(rpy) if x.find('ver') > -1]

perl5.8で日本語を扱うこと

昨日の続き

  • フォームが文字化け
  • 正規表現の部分がよくわからなかった。

丸ごとperlで紹介されていたDevel::Peekを使ってみた。MFPMによるとやっぱ、UTF-8フラグ探知モジュール的な使い方が多いのか。こういうのはプリントデバッグ的で好き。#の行が無駄に増えるけど。

ProductName まるごとPerl! Vol.1
小飼 弾
インプレスコミュニケーションズ / ?円 ( 2006-08-24 )


で後者の正規表現のマッチがよくわからんという部分は、mecabのパース$m->parseToNode($word)でutf8フラグがたたないことが原因だった。わかってみればそりゃそうだと思えるが。

my $n = $m->parseToNode($word);

while ($n = $n->{next}) {
    my $devword = decode("utf8",$n->{feature});
    #   if ($devword =~ /^\345\220\215\350\251\236/) { # 名詞
    #    if ($devword =~ /^\x{540d}\x{8a5e}/) { # 名詞
    if ($devword =~ /^名詞/) { # 名詞

        my $w = $n->{surface};
        print $w,"\n";
    }
}

use utf8しとけばx{540d}x{8a5e}でも名詞でもマッチした。なんとなく体で理解したっぽい。以下参考にしたページ。

で、前者のフォームが文字化けの部分はさっぱりわからん。どうも、HTML::Template通るときに文字化けしてるっぽい。うーん。

perlで関数型のプログラミングをするモジュールとか

List::UtilとかList::MoreUtilsというものを教えてもらったので、少し読んでみた(というか自分用のメモ的な意味合いが強いかも)

あと、リスト操作の動作確認するために、対話型のperlshを使ってるが便利だ。

List::Util

リストの最大、最小の要素を返したりとか。reduceで同じことができるのでreduce覚えておけばよい感じ。日本語訳

perlmolのChemistry::InternalCoords ::Builderだとこんな感じで使ってる。

$ref = ${
    reduce { $a->[0] < $b->[0] ? $a : $b }
    map { [$atom->distance($_)] }
    grep { $_ ne $atom } @$atoms;
}[1];

grep,mapでリストを操作した後、reduceを使ってお望みの要素を取り出すと。
というわけで、これといった例が思い浮かばないが、シュワルツ変換っぽく使えばリストでなくて要素が返ってくると。

List::MoreUtils

anyとかallとかのリストに対する真偽判断用の関数はこっち。日本語訳

pairwise、each_array、zipはfor文を入れ子にしなくてよくなるので、コードの見通しがよくなる感じ。

あと、QSAR記述子選択用のコード書くのに便利そうなのが、minmax(min==maxの記述子はこれでさくっと落とせる)。さらに、uniq組み合わせて、さらに数値のバリエーションのない記述子も落としていけるし、any使えばnullデータの入ってる記述子も排除できるので、今度preparation用のコードをList::MoreUtils使って書いてみよう。

fp::functionals

リスト操作用だけでなく、関数操作用のモジュールもあるだろうと探したら、やっぱありました

もうちょいhaskellまともに書けるようになったら使ってみたい(かな?)が、今のところはperlで関数型っぽくかけるのはリスト操作で十分かもという気がしてる。

poderosa4.02

WindowsXPでPoderosa3系使うとたまに落ちるのが困りもんだったが、4系は結構安定していていい感じ。

あとちょっとさくさく動くようになって快適感が増したような。

「みんな」から「ダイブイントゥー」そしてフィボナッチ

みんなのpythonを読んだら、もうちょっと実践的なコードを基に、他の言語と比較しながら説明してあるDive Into Pythonなど読むべし。pythonの初歩からhtml,xmlの処理、そしてSOAPによる通信といった割と基本的な(けど実用的な)章があって、終わりのほうは単体テスト、リファクタリングといったテスト技法や、関数型プログラミングに関しても触れてるので、全体を読んでpythonへの理解はかなり深まった(と思う)。わからないところも、みんなのpython片手にPython ライブラリリファレンスひけば、大概解決したし。

で、17章にフィボナッチ数を求める例があって、そこでジェネレータ使ってたのをみてジェネレータって便利だと理解した。

def fibonacci(max):
        a,b = 0,1
        while a < max:
                yield a
                a, b = b, a+b

for n in fibonacci(1000):
        print n

とfibonacci関数定義するだけでフィボナッチ数が。perlで書いたのと同じようなアルゴリズムなのにperlより簡単にかけているのはyield文のせい。

ProductName みんなのPython
柴田 淳
ソフトバンククリエイティブ / ?円 ( 2006-08-22 )


060914追記

perlでもクロージャ使えば同じようにかけるわ。ということに朝起きたときに気づいた

sub fibonacci {
    my $max = shift;
    my ($fib,$a,$b,) = (0,0,1);
    return sub {
        ($fib,$a, $b) = ($a,$b, $a+$b);
        if ($a < $max){
            return $fib;
        }
    }
}

my $f = fibonacci(100);

pythonにもクロージャってあるんだろうけど、ジェネレータとの使いわけってどうなるんだろうか?

Dub Dread 2

ダブっていうか、ジャングルよりな気が。ラガな感じの、she's goneとかShout Ballout (Ray Keith Remix)なんかが気持ちヨサゲ。

ProductName Dub Dread 2
Ray Keith
Dread / 1594円 ( 2007-07-10 )


Blade Runnerの曲も古き良きっていうか、loving youなんかはアートコア目が強くて好き。なんといってもアートコアは浮遊感がね。あと1.5Kってのもお買い得感が高め。

抜天

抜天で送別会。2階が個室で畳の円卓になっているので、子連れもOK。しかも美味い。
子供OKの店ってあまり知らないので重宝する。

箸

前菜4種盛りは、椎茸の含煮と砂肝が美味しかった。そしてふかひれスープも。

前菜4種盛り合わせ ふかひれスープ

チキンと鮑の炒め物。鮑は柔らかく、メンバーの中でも好評だった。

鶏 鮑の炒め物

なんかの揚げ物(忘れた)と海老のチリソース。

忘れた エビチリ

あと、炒め物がもう一品と、チャンポンと杏仁豆腐がデザートで。

紹興酒も一本空けて、満足。というわけで、また行きたい。

抜天

rpy

Statistics::RもRSPerlもイマイチ感が強かったので、rpyを使い始めているが、こんなに便利とは思わなかった。

というわけで、rpyで主成分分析を行い、できたモデルで新しいデータの主成分を求めてみるというサンプルを。  今回はrpyのテストなのでデータはrnormで作った。普通バイオインフォとかケモインフォなパターンだと、遺伝子の発現レベルとか、化合物のディスクリプターを使うけど。

>>> from rpy import *
>>> r.library('stats')
>>> a = r.matrix(r.rnorm(15),5)
>>> b = r.matrix(r.rnorm(15),5)
>>> model = with_mode(NO_CONVERSION,r.prcomp)(a)
>>> model
<Robj object at 0xb7f9f1c0>
>>> r.predict(model,b)
array([[ 0.28817526, -2.20038126,  0.42937523],
      [ 0.76682094, -1.38050702,  0.24898564],
      [-0.28308137, -0.51609132,  0.12062971],
      [-0.68531169,  1.42599763,  0.03987597],
      [-1.35685327,  0.02394946, -1.03868517]])

と数行ほどで、予測したいデータセットの主成分がpythonのarray型で返ってくるので、このあとの処理が凄く楽チンになる。

rpyはデータのコンバージョンのやり方だけきちっと押さえておけばあとはRと一緒に扱えるのだが、コンバージョンのモードが色々あって、初めのほうは悩まされることが多かった。特にモデルをRで適用する場合、python形式にコンバートしてしまうとRで扱えなくなってしまうのでNO_CONVERSIONモードにしないといけない。

Meadowにpython-mode

最近pythonに真面目に取り組んでいるので、Meadowにもpython-modeを入れた。

Emacs/Meadow2 - 2.00pre1

;;;Add python mode (setq auto-mode-alist (cons '("\.py$" . python-mode) auto-mode-alist)) (setq interpreter-mode-alist (cons '("python" . python-mode) interpreter-mode-alist)) (autoload 'python-mode "python-mode" "Python editing mode" t)

obfitのソースを眺めてみた

openbabelの分子重ね合わせツールのobfitをperlのモジュールにできんもんかな?とソース(C++)を眺めていたら、QTRFIT というアルゴリズム(実装はC++)を使っているようだ。

結局最大の重ねあわせを求めるのを固有値問題に落とし込んでるようだ。

QTRFIT

The eigenvector associated with the largest eigenvalue gives the desired quaternion. To generate a rotation matrix we consider the effects of the quaternion on the cartesian unit vectors

で、それをJacobi法で解いていると。感覚的にはそうなんだろなぁと思うが、ここら辺の理解度はちょっとあやしい。