ここみた。
NodeBoxも楽しいなぁ
haskellのK-meansのソース読んでたら
dist a b = sqrt . sum $ zipWith (\x y-> (x-y) ^ 2) a b
ってのがあって、pythonでzipWithってあったかなーと思って検索したら、自分のwikiが引っかかった。★付けたいところ。
これをつかうと
from math import *
zipWith = lambda f, xs, ys : [f(x, y) for x,y in zip(xs, ys)]
def dist(xs, ys): return sqrt(sum(zipWith(lambda x, y: (x-y)**2, xs, ys)))
となって、任意の次元にも対応出来る
>>> dist([1,2,3,4],[2,2,2,2])
2.4494897427831779
13012010 Python
A*で解いてみた。距離はマンハッタン使った。
maze = ["**************************",
"*S* * *",
"* * * * ************* *",
"* * * ************ *",
"* * *",
"************** ***********",
"* *",
"** ***********************",
"* * G *",
"* * *********** * *",
"* * ******* * *",
"* * *",
"**************************"]
start = ()
goal = ()
max = len(maze) + len(maze[0])
for (h,line) in enumerate(maze):
for (w,word) in enumerate(line):
if word == 'S': start = (h,w)
elif word == 'G': goal = (h,w)
checked = [start]
sol = [start]
def add_route(r):
(h,w) = r[-1]
cand = [c for c in [(h+1,w),(h-1,w),(h,w+1),(h,w-1)] if c not in checked and not_wall(c)]
if len(cand) == 0:
return r[:-1]
else:
sol = (); cost = max
for c in cand:
c_cost = calc_cost(c)
if c_cost < cost:
cost = c_cost
sol = c
r.append(sol)
checked.append(sol)
return r
def not_wall(p): (h,w) = p; return maze[h][w] != '*'
def calc_cost(p): return (abs(goal[0]-p[0]) + abs(goal[1]-p[1]))
def check_goal(sol): return sol[-1] != goal
def draw_sol(sol):
solved_maze = ''
for (h,line) in enumerate(maze):
for (w,word) in enumerate(line):
if (h,w) in sol[1:-1]:
solved_maze += '$'
else:
solved_maze += word
solved_maze += '\n'
return solved_maze
while check_goal(sol): sol = add_route(sol)
print draw_sol(sol)
実行結果
$ python maze_aster.py
**************************
*S* * $$$ *
*$* *$$*$ ************* *
*$* $$* $ ************ *
*$$$$* $$$$$$$ *
**************$***********
* $$$$$$$$$$$$$ *
**$***********************
* $$$$$*$$$$$$$$$$$$$$G *
* * $$$ *********** * *
* * ******* * *
* * *
**************************
13012010 Python
この問題。
maze = ["**************************",
"*S* * *",
"* * * * ************* *",
"* * * ************ *",
"* * *",
"************** ***********",
"* *",
"** ***********************",
"* * G *",
"* * *********** * *",
"* * ******* * *",
"* * *",
"**************************"]
solution = []
start = ()
goal = ()
max = (len(maze)-2) * (len(maze[0])-2)
for (h,line) in enumerate(maze):
for (w,word) in enumerate(line):
if word == 'S': start = (h,w)
elif word == 'G': goal = (h,w)
checked = [start]
def add_route(sols):
newroute = []
for sol in sols:
(h,w) = sol[-1]
if ((h+1,w) not in checked) and maze[h+1][w] != '*':
nr = list(sol)
nr.append((h+1,w))
checked.append((h+1,w))
newroute.append(nr)
if ((h-1,w) not in checked) and maze[h-1][w] != '*':
nr = list(sol)
nr.append((h-1,w))
checked.append((h-1,w))
newroute.append(nr)
if ((h,w+1) not in checked) and maze[h][w+1] != '*':
nr = list(sol)
nr.append((h,w+1))
checked.append((h,w+1))
newroute.append(nr)
if ((h,w-1) not in checked) and maze[h][w-1] != '*':
nr = list(sol)
nr.append((h,w-1))
checked.append((h,w-1))
newroute.append(nr)
return newroute
def check_goal(sols):
for sol in sols:
if sol[-1] == goal:
print draw_sol(sol)
exit
def draw_sol(sol):
solved_maze = ''
for (h,line) in enumerate(maze):
for (w,word) in enumerate(line):
if (h,w) in sol[1:-1]:
solved_maze += '$'
else:
solved_maze += word
solved_maze += '\n'
return solved_maze
sols = [[start]]
for i in range(max):
sols = add_route(sols)
check_goal(sols)
ちょっと長い
$ python maze.py
**************************
*S* *$$$$ *
*$* *$ *$ ************* *
*$*$$$* $ ************ *
*$$$ * $$$$$$$ *
**************$***********
* $$$$$$$$$$$$$ *
**$***********************
* $$$ *$$$$$$$$$$$$$$G *
* *$$$$$ *********** * *
* * ******* * *
* * *
**************************
ダイクストラ法とA*アルゴリズムの違いをあとで読む
pylonsはじめました。なかなか面白そうです。
とりあえず、getting startedとflickr search tutorialはやってみた。
catalystとかJiftyとかturbogearsとか(RoRもそうだっけか?)はとりあえずプロジェクトを用意して何も考えずサーバー起動してアクセスすると小洒落た画面がでてきて、おー!ってちょっとした感動を覚えたりするんだけどpylonsの場合はそういうのなしの方向で。
ただ、エラー吐かすとなんかすごいよ。エラーから入らせるとは、、、テストファースト?
QuickWiki Tutorialに続く、、、
12012010 chemoinformatics bioinformatics Python
python2.5に入れる場合はNumericがsourceforgeになかったり、MxTextToolsの古いバージョンを入れたりとか、いろいろとあれなので、ドキュメント読みましょうってことです。
で、RCSBからgz圧縮されたpdbファイルをとりにいってBioPythonで扱うサンプル
import urllib2, StringIO, gzip
from Bio.PDB.PDBParser import PDBParser
def fetch_pdb(id):
url = 'http://www.rcsb.org/pdb/files/%s.pdb.gz' % id
content = urllib2.urlopen(url).read()
sf = StringIO.StringIO(content)
return gzip.GzipFile(fileobj=sf)
if __name__ == "__main__":
p=PDBParser(PERMISSIVE=1)
s=p.get_structure("1bgw", fetch_pdb("1bgw"))
for model in s.get_list():
for chain in model.get_list():
for residue in chain.get_list():
if residue.has_id("CA"):
ca_atom=residue["CA"]
print ca_atom.get_coord()
ところで、製薬系のドラッグデザインっていうかchemoinformaticsなSoftwareはpythonで拡張できるものが多いんだけれども、その割にはpythonでガリガリ書くよっていうヒトはあんまし見かけたことないんですよね。
またwikiかよ、、、と敬遠しがちなWikiを作ろうチュートリアルだけど、フレームワーク自体はじめてのヒト向けには素直に書かないといけないし、幾つかのフレームワークを渡り歩いたヒトにも新たな発見とか他のフレームワークとの違いを見せるようなサンプルにしないといけないので、意外と構成を考えるのが難しいですな。
そういった意味ではpylonsでwikiを作ろうチュートリアルはdeleteの実装がajaxでのドラッグドロップになってて、しかも簡単に実装できる!っていう喜びが得られてナイスな感じ。
ルーティング周りをちょっとよく理解していないのと、Ajaxがあっさり書けすぎてて何をやっているのかわからなかったので、あとでpylonsでなんか作ってみよう。
12012010 bioinformatics Python
Bioinformatics Programming in Python: A Practical Course for Beginners という書籍が出るらしい。
TOC見る限りはあんま欲しいとは思わないけど、他にもpythonでbioinformaticsという本が2冊くらいは出るらしいので、そっちのほうに期待。
PILを使うと簡単にかける
Image.open(f).resize((480,360)).save(outfile)
と書くだけで読み込んでリサイズして別名で保存できる。そんな感じで、とりあえずflickrのかわりに、リサイズして保存したらmarkdown書式でURLを出力するようなスクリプトを書いた。
import sys,datetime
import Image
if len(sys.argv) < 2:
print sys.argv[0], " image_file"
for f in sys.argv[1:]:
now = datetime.datetime.now().strftime('%s')
outfile = "/var/www/html/images/blog/" + now + ".jpg"
Image.open(f).resize((480,360)).save(outfile)
print r"![%s](http://www.kzfmix.com/images/blog/%s)" % (now,now + ".jpg")
あとはドラッグドロップで転送するようにする