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 Journalプログラミング

Reveal.jsを使おうとしてweb-mode入れたけどmarkdownの方がいいかもしれない

Keynoteを使ってフォントサイズや色などをチマチマ変更する作業が非常に面倒なことが最近あって,Reveal.jsで怠けてスライド作りをしたいという気分になった.


噂ではmarkdown使ってかっこ良く使えるらしいが,markdown覚えられない古の世代の人間なので,とりあえずhtmlの環境を作ることに.


Reveal.jsをダウンロードしてきたらそれでおkなので,htmlファイル編集の方が大変.emacsでhtml編集に関してググっていたらweb-modeがいいらしいので,インストールした.インストールはemacs側で簡単にM-x package-refresh-contentsを一応してからM-x package-install web-modeして初期設定を入れるだけ.

(require 'web-mode)
(add-to-list 'auto-mode-alist '("\\.phtml\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.tpl\\.php\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.[gj]sp\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.as[cp]x\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.erb\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.mustache\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.djhtml\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.html?\\'" . web-mode))
(setq web-mode-engines-alist
'(("php"    . "\\.phtml\\'")
  ("blade"  . "\\.blade\\.")))

こうやってコピーしてきて,初期設定なのか自分のemacs設定の問題なのか,インデントが大きすぎてクソゴミ状態だったのでこちらのサイト様を見て直す.インデントの設定,未だによくわかっていない.


とりあえず使えるようになった気分.数式を使うためにMathJaxの設定も入れた.入れる場所はOfficialのReveal.jsをダウンロードして来た場合,index.htmlの一番下にある部分(たぶんどこでもいいけど,Reveal.jsの本体をいじってもここに書いた設定が後から上書きされている用に見えた).

// LaTeX
    math: {
     mathjax: 'http://cdn.mathjax.org/mathjax/latest/MathJax.js',
     config: 'TeX-AMS_HTML-full'  // See http://docs.mathjax.org/en/latest/config-files.html
    },



後でこの辺り読む予定


ただ僕はかっこいいプレゼンがしたいわけではなく,手抜きしてそれなりのを作りたいだけなんだけども.