Parabola JournalPython

IPythonで棒グラフを描く

新年です,今年もよろしくおねがいします.
飲みすぎて頭の悪い生活を送っているので,書き初めしました.


関係データ学習の本を読んでいると,棒グラフを描く場所があったので,IPythonで描いてみた.Ticksを弄ることなくできるともっといいのでもう少し調べたい感じも.

import numpy as np
import scipy as sp
import scipy.stats as sst
import matplotlib.pyplot as plt
import seaborn as sns
# alpha1 = np.array([0.1, 0.1, 0.1, 0.1])
# alpha2 = np.array([0.5, 0.5, 0.5, 0.5])
alpha3 = np.array([1.0, 1.0, 1.0, 1.0])
df1 = sst.dirichlet(alpha=alpha3)
v1 = df1.rvs(size=1).flatten()
xv = [1,2,3,4]
plt.bar(xv, v1, align="center", width=0.5)
plt.xticks(xv, xv)




Python

Cythonのオライリー本を読んでいる

少し前にEbookか何かか,オライリーのサイトあたりで見た記憶があったけど,たまたまルネに行った時に置いてたので買ってきて読んだりサンプルコード実行したりプログラム書いたりしている.Cythonは情報がWeb上に散らかっている分しかないので,日本語のまとまった本を待っていた.過去に何度か書いたCython関係の記事では主にビルド方法に悩んでいたけど

今回はそういった話も日本語でまとまっているので良かった.

Cython ―Cとの融合によるPythonの高速化
Kurt W. Smith
オライリージャパン
売り上げランキング: 51,162


前半(5章まで)の大まかな感想とかまとめ

  • cythonbook/examples · GitHubにサンプルコードがある,すぐ試せる
  • Cythonの拡張子は普通のpython-modeだと普通は無視されるのでcython-modeを入れる.ここから入れたら動いた→cython/Tools at master · cython/cython · GitHub
  • 基本的に何もしなくてもコンパイルすると,それなりに高速化される
  • 変数に型情報をつけると最適化できるようになるので,かなり高速化される
  • 関数呼び出しにオーバヘッドがある(PythonのCall)のが,cdef/cpdefで結構改善される
  • CythonでC/C++のポインタとかメモリ確保・解放処理に相当する部分もあると知ったけどたぶん使いたくないので使わないと思う.
  • データ型をC/C++の構造体に翻訳するので(Cython拡張型),ちゃんとデータ構造を考えると速い(private/readonly/publicなどがある.あと継承なども保存されるらしいけど使ったことはない)

続きも読む.後半はpydファイルとかpyiファイルとか今まで使ったことないものの章だ.

Python

Pythonスクリプトを編集するときにテンプレートを使う

EmacsでPythonスクリプトを書くときに、毎回先頭に

# -*- coding:utf-8 -*-

def hoge():
  pass

if __name__ == '__main__':

と入力して書き始めるのが面倒(+忘れる)ので何かいい方法がないかな?と考えていたら、Emacsでファイル編集するときにテンプレートを挿入する(auto-insert)機能みたいなのがあるらしいと分かったのでその設定をした。

参考にしたサイト: http://www.02.246.ne.jp/~torutk/cxx/emacs/mode_extension.html

Parabola JournalPython

ラングトンのアリ(GIF,python,numpy,matplotlib,ImageMagick)

毎日寝る前にイアン・スチュアートの「数学の秘密の本棚」という本を読んでいる。だいたい5ページぐらいで寝落ちする。

数学の秘密の本棚
数学の秘密の本棚
posted with amazlet at 15.05.28
イアン・スチュアート
ソフトバンククリエイティブ
売り上げランキング: 86,191

その中に「ラングトンのアリ」というトピックがあったのでGIFアニメを自分で作った。一言で言うと二次元平面の上をアリが移動するんだけど、色が白なら黒に、黒なら白に反転して、白の場合は左回転、黒の場合は右回転して一歩前に進むというゲーム。証明されているのかな?

ラングトンのアリ – Wikipedia

本当はmatplotlibのアニメーション作る機能でmp4を作り、moviepyでmp4をGIFアニメにしてたんだけど、処理が重すぎたのでImageMagickに投げて、あとコマを間引きして作った。ImageMagickでGIFアニメ作るときは-delayを適当に。

movie



# -*- coding: utf-8 -*-
# date: 2015/05/28
# author: @taki__taki__

# packages
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as ani

# parameters
X, Y, x0, y0 = 200, 200, 100, 100
max_iter = 50000

# direction (N0, E1, S2, W3)
class Direction(object):
def __init__(self, d):
self.d = d
def turn_right(self): self.d = (self.d + 1) % 4
def turn_left(self): self.d = (self.d – 1) % 4
def __str__(self):
if self.d == 0: return “N”
elif self.d == 1: return “E”
elif self.d == 2: return “S”
elif self.d == 3: return “W”
else: return “X”

def get_next(x, y, direction):
if direction.d == 0: return (x, y+1)
elif direction.d == 1: return (x+1, y)
elif direction.d == 2: return (x, y-1)
elif direction.d == 3: return (x-1, y)
else: return (x, y)

if __name__ == ‘__main__’:
# initialize the board
board = np.zeros((X, Y), dtype=np.bool)
direction = Direction(0)

# iteration
x, y, counter = x0, y0, 0
for i in range(max_iter):
if x >= X or y >= Y or x < 0 or y < 0: break # out of the board

# Black: turn right / White: turn left
if board[x][y]: direction.turn_right()
else: direction.turn_left()
board[x][y] = not board[x][y] # flip
x, y = get_next(x, y, direction) # move 1 step

if i % 300 == 0:
counter += 1
fig = plt.figure(figsize=(3,3))
ax = fig.add_subplot(111)
ax.imshow(board, interpolation='nearest', cmap='Greys')
ax.get_xaxis().set_ticks([]); ax.get_yaxis().set_ticks([])
plt.title("Langton's ant")
plt.savefig("pngtmp/png_%05d" % counter)
plt.close()
[/python]

Parabola JournalPython

PyCharm上でCythonのビルドを簡単にするには

公式のドキュメントにCython support(リンク: Cython Support)というページがあるのでそれを参考にする.

すごく完結に「external toolsを使う」と書いてあってもう少し説明して欲しかったけど,おそらくCythonのビルド方法にもいろいろあるので説明が面倒だったのだろうと推測する.とりあえず一番まわりくどいけどいろいろ使えるsetup.pyを使った方法でのexternal toolsの設定方法をまとめた.

まずSettings→Tools→External ToolsにCythonを新しく作る

pycharm_cython_1

細かいところは読んでいないけど,pythonコマンドの設定と引数の設定(setup.py, build_ext, –inplace)をする.

pycharm_cython_2

Program: $ModuleSdkPath$ → 使うpythonインタプリタのパス
Parameters: $FilePath$ → ファイルのパス(setup.py) build_ext(そのまま) –inplace(そのまま)

最後にキーボードショートカットを設定.設定はKeymapsから.

pycharm_cython_3

あとはプロジェクトを作って,setup.pyを書く→External Toolsでコンパイルする→.soが生成される→嬉しい.意外と設定簡単だった.