(wrist blog)

twitterはこちら http://twitter.com/wrist

PyConJP2015の今更な参加記

昨年に引き続き2015/10/10-11に東京までPyConJP2015に参加しに行って来ました。開催から3週間経ってしまいましたが、やはり記録に留めておきたいと思ったため今更参加記を書きたいと思います。

1日目

会場は去年と一緒だったので特に迷わずに辿りつけました。

朝7時頃に伊丹空港を出て8時頃に羽田空港に着く飛行機に乗ったのでオープニングには無事に間に合いました。

keynote

  • 資料
  • 中継が上手く行かないか何かで一回やり直しになった
  • アプリケーションのエラー検知、メトリクス、ロギングの話を非常に丁寧にしていた印象

強くなるためのプログラミング ープログラミングに関する様々なコンテストとそのはじめ方ー

  • 資料
  • Pythonアイドルくーむさんの発表
  • 競技プログラミングの話をジャンル別(アルゴリズム、ゲームAI、データマイニング、セキュリティ、サーバインフラ)に分けて紹介
  • アルゴリズム
  • ゲームAI
    • そもそもゲームAIのコンテストがあることを知らなかったので新鮮
    • Codingame, CODE VS
  • データマイニング
    • kaggle
  • サーバインフラ
    • ISUCON
  • セキュリティ
    • SECCON
    • 本も出ている(セキュリティコンテストチャレンジブック)

Python と型ヒント (Type Hints)

  • 資料
  • Python3.5から導入された型ヒントについての話
  • Python3.0で導入された関数アノテーション(PEP484)やmypyプロジェクトを背景に、型ヒントがどのような用途で使われるかを説明
  • 型ヒントが付与されていないサードパーティ製のライブラリに対して前方宣言のような形で型ヒントを外部ファイルで定義可能なスタブの仕組みもあるが、全てのサードパーティ製のライブラリに対してメンテされる訳でもないので運用上の問題もあるのでは、といった話が出ていた
  • 型チェックを真に誰が必要とするかについては上記リンクの記事にも言及あり

Lunch

何種類からか選べたが写真を撮り忘れたためもはや何を食べたか覚えていない

日本のオープンデータプラットフォームをPythonでつくる

  • 資料
  • 政府統計の窓口のサイトとしてe-Statというものがあるが、検索は遅いわデータはエクセルで配布されているわで非常に使い勝手が悪いので、それを使いやすくするデータプラットフォームを開発しているという話
  • スケジューラとしてGoogle CalendarとTornadoを組み合わせて手動でカレンダー上に登録したスケジュールに従ってジョブを実行
  • ジョブはrq(参考)というジョブキューを使ってタスク分散
  • スクレイピングはBeautifulSoupとlxml
  • Excel, PDFのパージングはpython-excel, pypdf, pandasのread_excel()
  • 整形等はpandas経由
  • 全文検索はelastic search
    • Mecabを使うためのダーティハックをしているとのこと
  • RESTサーバはTornado
  • マイクロサービス構造を意識しており、python製のプロセス管理ツールsupervisor(参考)を使ってサーバプロセスを管理し、zmqを使って非同期メッセージングを実現
  • デプロイはsaltstack(chefみたいな構成管理ツール)とJenkinsを利用、監視はZabbix

Pythonで作る俺様サウンドエフェクター

  • 資料
  • 自分は音響信号処理が専門なので量子化や標本化といった概念は日常的に触れているが、その辺りを専門外の人に対しても非常に丁寧に説明していた印象
  • 音のデモはやはりリアルタイムに魅せられるのでインパクトが大きい

Break

写真にヘルシープログラマが写っているが買えば良かった感。 ガチャは一応引いた。

ゴミ箱にコップをどうやって捨てるかで性格を診断するということなのか。

Let it crash: what Python can learn from Erlang.

  • 資料
  • gunicornの作者によるPythonErlangから何が学べるかのトーク。
  • Erlangの信頼性はプロセスのisolation、パターンマッチング、メッセージパッシング、共有メモリがないことから来ている
  • Erlangはプロセスがエラーを起こしても全体として動き続けるし、それを検知して自動復帰する事が可能であるがPythonでは1スレッドで動作していたりGILなどもあってプロセスのisolationが困難
    • Supervisor、ロードバランサやProxy、コンテナといったシステム側で対処
  • イミュータブルなデータ構造はテストやスレッドセーフの観点から好ましいがPythonで実現するためにはFunktown, Pysistenceといったライブラリが存在
  • Erlangに存在するようなパターンマッチを実現するためのpatternsというライブラリがある

Packaging最前線

  • setuptoolsのバージョンが去年から10以上上がった
    • PEPへの追従のためもあるがそれでも12以降は不明
  • pipはバージョン7.0からはeggではなくデフォルトでwheelを使用するようになった、wheel形式であればpipはキャッシュしてくれるようになる
  • python3.4から導入されたensurepipはpipとsetuptoolsをpythonと同時に入れてくれる仕組みだが、linuxディストロは独自にpipを管理しているのでensurepipが入らないことがある
  • distlib: パッケージ関連のPEPを実装しているライブラリ、pipが内部で使っている
  • site: サードパーティ製のライブラリがインストールされるsitepackageの場所を確認するために利用
    • debianはsitepackagesが沢山ある謎パッケージ機構
  • distlib.databaseを使うと依存関係グラフを表示可能だがpipでは何故かできない

Lightning Talks

  • 3分でサーバオペレーションコマンドを作る技術
    • 資料
    • fabricとClickの紹介
      • fabricはライブラリとしても使える
      • Clickはサブコマンドを伴うCLIツールを簡単に作るためのライブラリ
        • argparseは取り扱いが面倒
        • デコレータでサブコマンド指定ができる
        • fabricとの組み合わせで独自サーバオペレーションコマンドが作れる
  • PyCon Canada 2015
  • Djangoから各種チャットツールに通知するライブラリを作った話
    • 資料
    • djangoからHipChatやSlackなどに簡単に通知するためのライブラリdjango-channelsの紹介
  • pandasによるデータ加工の注意点やライブラリの話
    • 資料
    • akashi.pyの存在を知った
    • pandas_validatorというpandasのDataFrameに対するバリデーションを可能とするライブラリの紹介
  • Dask: 軽量並列計算フレームワーク
    • 資料
    • Daskという軽量並列分散フレームワークの紹介
    • pandasのDataFrameを分割して処理することが可能
    • 四則演算や統計量を求める計算などが可能、compute()を実行することで初めて演算が実行される

Party

今年は関西方面から知ってる人が来るとは思っていなかったため、ぼっちPartyではないかなどと内心不安に思っていたら神戸R主催の河原さんが来ていたので違和感なくPartyに参加できた。河原さん経由で知り合いになれた方もできたので良かった。また、昨年知り合った方々の大半が今年も来ていたのも印象深く、来年も都合が会えばぜひ参加しようという気分になれた。

2日目

最近会社でモノタロウで買った商品が梱包されていたであろう箱を見つけたのでテンション上がった。

keynote

  • 資料
  • ビープラウド社長の佐藤さんの基調講演
  • これからの時代知識労働者はどう働くべきか、創造的なエンジニアになるためには、といった問いに対する答えを与えるような内容
  • 構成が上手いのか伝えようとする内容が頭にすっと入って来る感じで聴いていて心地良く、keynoteに相応しい内容だと感じた

Job Fair / Poster Session

ポスターセッションを見に行った後にジョブフェアを見た。ポスターセッションは2部屋あることに気付かず片方見ずに出て行ってしまった。

PyData Tokyoのステッカーを貰えたのが嬉しかった。 PyData Osakaもぜひ開きたいと宣言してしまったので実現に向けて動いていきたい。

pandas internals

  • 資料
  • pandasの内部に関する話
  • pandasはPANel DAta Systemの略
  • カラムは型ごとにブロックとして固めて保持
  • パフォーマンスが重要な関数はCythonで書かれている
    • 27,000行がCython
  • Reindex
    • インデックスラベルがユニークか否かで処理を分ける
    • ラベルからインデックスを得る部分はCのハッシュテーブルに対するCythonラッパーを利用、型別に最適化したエンジンが存在
    • インデックスはキャッシュ可能なのでユニークなインデックスであるかはキャッシュ
  • GIL解放
    • pandas 0.17.0以降では並列化のためにGILを解放して処理
  • パフォーマンスを出すためには
    • できるだけ組込みの関数を使う
      • 特にapplyは気を付ける必要あり、文字列カラム同士の結合だとapplyを使うと14.3s掛かるところがDataFrameの二項演算だと92.5msで済む
    • pandasのメソッドは基本的にビューではなくコピーを返す。従って二項演算を繰り返すとのその回数分コピーが発生してしまうため、最低限に留めるべき
    • dtypeとしてobjectを使うのは避ける
      • "str"は"object"として扱われる
      • dtypeを"Categorical"にした場合、59.7msかかっていた処理が17.2ms
    • joinする際に2つのテーブルのインデックスがソートされてなかったり一意でなかったりNaNが発生したりすると遅くなる

uWSGI/Dockerを利用したWebサービス運用事例

  • 資料
  • 日経新聞における運用事例
  • uWSGIは高機能、gunicornはシンプル
  • nginxと合わせた場合、単独の場合、などでベンチマークを取った結果uWSGIが早い
  • Gracefulな更新のための手法毎の比較

break

Pythonライブラリ厳選レシピはリファレンスとして普通に便利そうだったので購入。 購入時点で既に残り4部だった。 その後で著者陣のサインも頂けたので感無量。

セカイノカオ by チーム・カオ

  • 資料
  • PyConは合コンではない
  • 東京都現代美術館に展示した話、月の表面の顔検出の話、ジオタグ付きの画像に対し感情推定して地図上に表示する話など
  • 昨年もatelierhideさんの話を聞いたけど、pythonを使って面白いアイデアを実現することに対し本気で取り組まれていてすごいと思う

アドネットワークのデータ解析チームを支える技術

  • 資料
  • アドネットワークにおいて広告主、メディア、客、運営会社全員の利益を最大化するような問題に取り組む
  • BigQueryの結果をpandasで取得してJupyter Notebookで可視化するの超便利そう

Lightning Talks

  • TOC思考プロセスで考えるPython2->3移行問題
    • 資料
    • todogzmさんのLT、2から3に移行するにはどうすれば良いのか、という内容。モノタロウは2系の独自フレームワークを使っているとのこと。
  • Diversity in Brazil
  • PyConJPの舞台裏
    • 舞台裏や予算についてなど
    • 今年もEarlyBirdの時点で申し込めたので費用は8,000円で済んだのですが、パーティー代3,000円、弁当代1,000円x2だとすると3,000円だけで参加出来ているので非常に安く感じます。
  • sqldf for pandas
    • 資料
    • pandasのDataFrameに対してSQLが書けるライブラリ
  • ソーシャルログインを補完: PayPal APIを使った信憑性の高いユーザーデータベースの構築

Closing

じゃんけん大会は一切勝てず何も貰えなかったがモノタロウ侍が可愛かったのでそれだけで良かった、そう、それだけで良かったんや…

終了後

帰りは新幹線で大阪へ。 酒飲みながら帰ったためかこの時に書いた文章がミスって消えたのが開催から3週間放置した一番の原因であるのは内緒。

戦利品

パンフレット類は割愛したので実際にはもっとある。

参考

全スライドまとめ

ipython notebookで作成した資料のgithubへのアップロードおよびnbviewerでの閲覧

少し前から大阪PRML読書会で発表するために作成したipython notebookのipynbファイルをgithubにアップロードしている。

wrist/prml_ipynbs · GitHub

アップロードされたipynbファイルはnbviewerというサービスを通じて直接ブラウザ上で内容を見ることが可能であるが、書き溜めてはアップロードするという形が実際にノートにメモを取るかのようで謎の達成感を感じる。今年の内なる目標としてアウトプットを増やすというものがあるので、今後ともガンガンブログも書いてipynbもアップロードして、ゆくゆくはkagglerに進化したりウェブサービス作ったりハッカソンに参加したり主催したりしていきたいと願っている所存。

2015.05.25 追記

github上でipython notebookの内容が表示されるようになったため、nbviewer経由でなくとも直接github上で確認可能となった。

blog.jupyter.org

scipy.signal.freqz相当の処理を自分で書く

これまで仕事でデジタルフィルタの周波数特性を見るためにscipy.signal.freqzを使っていたのだが、連続して実行するとどうにも遅い。 ipythonでは%runで外部スクリプトを実行する際に-pを付けるとプロファイル結果を表示することが可能であるが、freqzを使っているスクリプトで簡単に測ってみたところ、どうやらfreqzの中で使われているnumpy.polyvalが重いことが分かった。そこで、デジタルフィルタの周波数特性の計算をfftで行うことを検討した。

結論から書くと、係数ベクトルが1次元の時は以下のような関数で代替可能である。正規化周波数の終端はscipy.signal.freqzと同じくπまでとしているため、wを周波数に直したい場合は(FS / (2.0 * np.pi))を掛ける必要がある。

import numpy as np
import scipy as sp
import scipy.fftpack as fft

def my_freqz(b, a=[1], worN=None):
    lastpoint = np.pi
    N = 512 if worN is None else worN
    w = np.linspace(0.0, lastpoint, N, endpoint=False)
    h = fft.fft(b, 2 * N)[:N] / fft.fft(a, 2 * N)[:N]
    return w, h

b = np.random.randn(1024)
a = np.random.randn(1024)

w, h = sg.freqz(b, a, 512)
my_w, my_h = my_freqz(b, a, 512)

np.allclose(h, my_h)  # -> True
np.sum(h - my_h) # -> (3.6308811859897538e-12-1.5773658421092129e-11j)

計算方法が違うため、誤差はあるものの非常に小さいため十分代替可能である。 ポイントはfftを2N点で計算して前半N点だけを使うところか。なおwの計算方法はscipy.signal.freqzと同じである。

折角なのでipython上で%timeitを使って時間を計測してみると、

%timeit -n1000 sg.freqz(b, a, 512)
1000 loops, best of 3: 18.7 ms per loop

%timeit -n1000 my_freqz(b, a, 512)
1000 loops, best of 3: 72.6 µs per loop

となり、速度的には上記実装の方が圧倒的に速い。ただし、scypy.signal.freqzは係数に対してatleast_1dを実行したり引数のチェックなども入っているため、実際には完全に同じ条件下での比較ではない。

なお、numpy.polyvalを使った計算とfftを使った計算結果が同じになる理由については、デジタルフィルタの周波数特性の定義式を素直にDFTとして計算するのか、FFTを使って高速に計算するのかの違いである。

hubコマンドでCUIでgithubにリポジトリを作成

完全なるメモ

$ mkdir repos_name
$ cd repos_name
$ git init .
$ hub create
$ git remote -v  # originが自動的に設定されている
  origin  git@github.com:username/repos_name.git (fetch)
  origin  git@github.com:username/repos_name.git (push)
$ vim readme.md  # readmeを追加
$ git add .
$ git commit -m "first commit"
$ git push origin master
$ hub browse  # githubに作成されたリポジトリをブラウザで開く

PyConJP2014に行って来ました

2014/9/13-14と東京までPyConJP2014に参加しに行って来ました。

参加経緯

これまでこういうプログラミング言語系のカンファレンスには地方Ruby会議ぐらいしか行ったことがなかったので、 常々東京でやっている本家のイベントに行きたいと思っていました。 関西でPython関連の読書会を始めたこともあってぼんやりPyConにも参加したいと思っていたのですが、そんなところにPRML読書会に来てくださっている@nekoallergieさんが割と速攻でEarlyBirdに申し込んでいたので、これは行くしか無いと思ったのがきっかけです。

1日目

それなりに早い時間に大阪を出発したものの若干ギリギリの到着になってしまいましたが、なんとかKeynoteに間に合いました。

Keynote: Kenneth Reiz

  • Requestsの作者のKenneth氏によるKeynote
  • python2と3について後者はまだまだ使われていない
  • 使った体験を貴方が他の人にシェアするんだ
  • 質疑応答「Python3を使う利点は?」「No benefit.」

Deep Learning for Image Recognition in Python

  • 資料
  • PyConは合コンではない
  • kaggleの犬猫画像識別
    • 画像認識
      • 特徴量はSURF、Haar-like featuresが一般的
      • Pythonライブラリ: OpenCV, Mahotas
    • 最初は特徴量としてHaar-like featureを用い、ロジスティック回帰で学習して正解率約60%
    • DNNを使って特徴量を抽出したらほぼ何もしなくても96%
    • 上位はそこから更に98.5%ぐらいまでチューニングなどして正解率を上げている、上位はガチの研究者達とのこと
  • DeepLearningのFramework
    • Theano/Pylearn2, cuda-convnet, OverFeat, Caffe, DeCAF
    • Pythonがコア言語なのはPylearn2とDeCAF
    • ライブラリによってPre-trained Networksという予め作成されたネットワークが利用できるかどうか違う
  • Pepper君に何をして欲しいかを一つ考えよう
    • アイドルをスカウトさせたい
    • JKC(人工知能)48
    • 最終的に画像をアップロードするとPepper君が点数を付けてくれるWebサービスのデモ

Gunicorn, the thundering herd and other concurrency programming challenges

  • 資料
  • gunicornはgreen unicornの略でUNIX向けのWSGI HTTPサーバ
    • rubyUnicornからpre-fork worker modelを移植している
  • thundering herd problemをいかにして克服したか
    • thundering herd problemとはイベントを待っている多くのプロセスがイベント発生時に全て動作しようとするが、同時に一つのプロセスしか処理ができない時に起こる問題のこと
      • 全プロセスが一旦起きるが一つしか動作できないので他は再び寝てしまい、これを繰り返すことでシステムに負荷が掛かる
  • チケット#792でhundering herdを解決
    • arbiterとworkerの間でパイプを通じてシグナルをやりとり
      • arbiterはsocketがreadできるかどうかをチェックし、workerはarbiterに仕事を要求するか生きていることをnotify
  • バージョン20.0では完全にgunicornコマンドのみになり、他のコマンド(gunicorn_djangoなど)については削除される予定
  • ユーザエクスペリエンスの向上を現在進行形で取り組んでいるとのこと
  • 前提知識が足りない、英語、途中から入った、という三重苦であまり理解できなかった

Lunch

弁当がでました(写真は撮り忘れた)

Data collection, analysis and optimization with python

  • 過去の番組表からタレントの出現頻度を分析
  • データ収集
    • requests, bs4(BeautifulSoup4), (Selenium)を用いる
  • データ分析
    • pandas, scikit-learn
  • 可視化
    • k-meansでクラスタリングした結果をmatplotlibで表示
    • タレントの出現頻度の時系列プロット、みのもんたは途中から(謎の理由で)頻度が減る、鳩山元首相も途中から消える
  • 当初何故かrequestsが入っていなくてデモができなかったが、最後でpip installして成功して会場から拍手
  • statsmodelがチラっと出て来たけど触ったことないので軽く触りたい

Effective numerical computation in Numpy adn Scipy

  • 資料
  • 効率的にスパース行列を計算するにはどうすれば良いのか、が主題
  • MedKitが参考になるとのこと Numpy MedKit
  • lil_matrixでスパース行列を構成し、csr_matrix, csc_matrix(row, colアクセスが速い)に変換すると良いとのこと
  • 自分で実際に触ってみた上で参考にしないと分からないなーという印象

Introduction to scientific programming in python

break

近くのコンビニのATMに金下ろしに行ってました。会場に戻ったら珈琲が出てたので適当に飲んでた。

リファクタリングツールあれこれ

  • 資料
  • 色々なリファクタリングのためのツールの紹介(vim寄り)
  • 感想
    • pep257知らなかった
    • vimのSyntasticを使うと勝手にpep8でチェックしてくれるのだが、調べたところflake8も使えるっぽいので後日vimrc弄りたい
    • 勝手に整形してくれるautopep8やautoflake知らなかったので後日試す
    • Ropeも便利そう、是非試してみたい

Mining sentiments in tweets using Python

  • tweet(英語)の極性判定の内容
  • Precision, Recall, F値という単語を久し振りに聞いた

Lightning Talk

  • Gunosyの広告配信サーバ
    • Pythonで構築している
    • 統計解析にNumpy,Scipy,Cython,Numba,Bokeh
    • この辺りの詳しい話がここ載っていた
  • pydun
  • 非エンジニアがPyConJPスタッフをしてみた
    • 緊張していたと言っていたが人事らしいしっかりした話し方
    • デプロイできる人事の存在に驚き
  • Djangoの話
    • 普段Djangoを書かないがためか何故かほぼ記憶にない

Party

  • @mzmttksさんがリプライをくれたこともあって、そのまま色々輪が広がっていって色々な人と話せたのですごい良かった、世の中は狭い

2日目

Keynote: Hirokazu Nishio

  • 若干遅刻したが大体聞けた

Job Fair

  • 皆コミュニケーションツールとしてslack使ってるのだなーと思った
  • ノマドデーを作ったらその日だけコミット数が少なくなったという話が途中であったが、人はサボるものなのだと思ってしまう

Poster Session

  • 確率プログラミング
    • PyMC3よりPyMC2の方がまだマシ、STANはオススメとのこと

Lunch

  • 2日目はサンドイッチだった、レタスが豊富に含まれておりでかかった

OpenCVpythonインターフェース入門

  • 資料
  • マイナビで連載をしているとのこと
  • OpenCV
    • いろんなモジュールが沢山入っている
    • C, C++版とほぼ同じ名前で関数を呼び出せるpython, Javaバインディングが存在
    • 最新バージョンは2.4.9だが最近3のベータ版が出た
  • import cv2
  • 基本モジュールとしてcore, imageproc, highv?(マウス操作など)
    • video(動画処理)、 calib3d(AR), ... 物体検出など
    • mlもあるがサポートベクターマシン、ランダムフォレスト、GMMもあるがscikit-learnなどの方が良い
  • OpenCV配列がnumpyとして保持される
    • imread()
    • 線形代数関連がそのまま使えるのがメリット
  • 画像の可視化
    • cv2.imshow()で実行可能
    • matplotlibも使える
    • 可視化するときだけBGRから変換が必要、内部的に扱うときはそのままでも良い
  • ガウシアンブラー
    • 自分で窓を定義しても良いが、OpenCVにも用意されている
  • エッジ検出
  • 動画の背景差分
    • background.subtrackterなんちゃらですぐできる
  • 人検出
  • QA
    • デメリットは速度
    • anacondaを使っている場合は2.4.9が入るのでそれが一番楽
    • c++だとCUDAとかOpenCLが使えるがpythonだと使えるのか
      • 使えない, cythonとかで組む, 3.0だとあるかもしれないが3.0だとpython3.x系対応

Pythonとscikit-learnではじめる機械学習

  • スパムフィルタの実装
  • ナイーブベイズを使って分類
    • scikit-learnのnaive_bayesのMultinomialで学習
    • クロスバリデーションで評価
    • 予測の説明は時間不足で端折られる
    • 全体的にscikit-learnを用いるとコードが驚く程短くなる
  • scikit-learnは異なる手法でもできるだけ同じインタフェースで学習やら予測ができるので学生時代に使いたかった

数理最適化によるパズルの解放

  • ipython notebookでプレゼン
  • 最適化問題を解くためのpulpというライブラリを使ってパズルを解く話
  • pulpモデラーであり、実際に問題を解くのは別に存在するソルバ
    • ソルバには専用ソルバと汎用ソルバが存在、現実に存在する複雑な問題を解く場合は専用ソルバを用いる
    • pulpをインストールするとCBCという汎用ソルバが同時に入るとのこと
  • LpProblem, LpVariable, LpAffineExpression, LpConstraintを使って問題を定義
    • あとはvalue, lpSum, lpDotさえ使えれば大丈夫とのこと(ただし中身を理解できていないので何が大丈夫かは分からない)
  • 数独やののぐらむ(ピクロス)などを制約を数式で定義して解く
    • 人が解いたら楽しいがコンピュータに解かせても何も楽しくないとのこと

break

  • 立話の中でmatplotlibはSliderなどのGUIっぽいものが使えるということを聞く
    • matplotlib.widgetsの中にSlider, Buttonなどが存在
    • サンプルを実行したところ、正弦波の周波数、振幅をスライダーで変化させ、ラジオボタンで線の色を変更可能なGUIが操作できた
  • @nekoallergieさんにiPadでiPython notebook(numpyなども含む)が使えるアプリCoumputableを教えてもらった
    • 後日インストールしたところ新規ノートを作るのに1000円払って機能解放しないといけなかったので辛い

データ分析の世界へようこそ!〜マーケティングに活かせるPythonライブラリ

  • 資料
  • Python2とPython3のユーザ数の違いに触れてPS3とPS4のユーザ数の違いに言及
    • Play PS4!
  • レコメンデーションにおいてはLiftという概念が重要
    • Xを買った人がYを同時に買う確率が、全体に対しYだけを買う確率に対して何倍であるかという指標
  • scipyのspatial.distanceに距離計算モジュールが存在している

正規表現リテラルは本当に必要なのか?

  • 正規表現文字列はダブルクオーテーションを使うとエスケープ文字をエスケープする必要が出て来るが、シングルクォーテーションであればエスケープしなくても良い
  • raw文字列が使える言語であれば同様に解決するが、Javaにはないのでバックスラッシュに拘らず他の文字を使って解決

Lightning Talks

  • 続・野球プログラミング
  • Pythonではじめる競技プログラミング
    • Pythonアイドルが競技プログラミングをやって青春
  • バイラルメディア
    • 炎上記事は見つけられず
  • PyConJP NOC
    • 参加者としてはありがたい限りです
  • SphixCon JP 2014
    • これまでもPyConとかOSCと共同で開催、今年もやるとのこと

Closing

  • 抽選は最後から2番目に当たった、PyConKrのTシャツを頂いた

雑感

  • 普段自分が使っているmatlabライクにオーディオファイルが扱えるscikit.audiolabは3系に対応していない上にほぼメンテナンスされていない状態
    • これが原因で3系に移れなかった
    • 初日のKeynoteを聞いて他人がなんとかしてくれることを期待してはいけない、自分でどうにかせねばと強く思った
  • 科学寄りの人が多いし英語の発表が多く軽い学会気分
    • 科学寄りの人達は皆iPython notebookを使っていた。あとJuliaに興味がある人も多かった
    • anacondaを使わないとダルいという話が随所であった気がするが皆同じこと思ってるものだと感じた
  • MBAの電池が志半ばな時間帯に2日とも尽きるし2日目に至ってはiPadの電池すら尽きる
  • 日本国内で自分の英語力を鍛える環境をどうにかして整えねばならない
  • どこかの発表でPyTablesが出て来たので後日調べる

pythonでwavファイルを扱う108の方法

108もないので3つ紹介します。2.7.x系でしか動作は確認してません。

2015/2/11追記: audioreadを追加

2015/5/25追記: pysox, pydub, PySoundFileを追加

wave

標準ライブラリなので何もしなくてもimport waveするだけで使えます。

import wave
    
wave_file = "/path/to/wave/file"
wf = wave.open(wave_file)
data = wf.readframes(wf.getnframes())
wf.close()

しかしこのdataを配列に読み込むなどするにはstringで返って来るために unpackしないと行けなかったりで地味にめんどくさいです。 詳しくは下記リンクを。

ドキュメントの和訳
参考:てくてくラボ

scipy.io.wavfile

scipy.ioにあるwavの読み書きクラスです。 その内良くなっていくのかもしれませんが、現状readとwriteしかなく、正直公式のwaveクラスよりも低機能な状態です。 waveを使わない場合は下記のscikits.audiolabを使った方が無難だと個人的には思ってます。

ドキュメント

scikits.audiolab

scipyよりも高度なアルゴリズムなどが実装されたscikitsですが、その中にlibsndfileのpythonラッパーであるscikits.audiolabというものが存在しています。 audiolabにはmatlabライクなwavread, wavwriteといったメソッドと、よりCのlibsndfileに近い挙動のSndfileクラスが存在しています。 以下のような感じで使います。

import scikits.audiolab as al

wave_file = "/path/to/wave/file"

# wavread
data, fs, fmt = al.wavread(wave_file)

# Sndfileクラス経由での読み込み
f = al.Sndfile(wave_file)
data = np.array(f.read_frames(f.nframes), dtype=np.float64)
f.close()

libsndfileのラッパーなのでlibsndfileで扱える形式が読み込めます。 扱える形式についてはoverviewのSndfileクラスの一番下に書いてあるコードで一覧を出力可能です。

ドキュメント
github

audioread(2015.2.11追記)

scikit.audiolabは2.7.x系でしか使えない(3系に対応したforkは存在)のですが、3.x系でも使えるライブラリとしてaudioreadというものがあります。

sampsyo/audioread · GitHub

このライブラリはシステムにインストールされているさまざまなオーディオ関連のライブラリをバックエンドとして音声ファイルを読み込むことを可能とするライブラリで、現在は

が利用可能であるとのことです。

利点や使い方についてはこのnotebookに詳しく載っていますが、

  • 良い点
    • WAVEXのような形式にも対応
      • WAVEXは多チャンネルに対応したWAVEの拡張フォーマット
    • python2系でも3系でも利用可能
  • 悪い点
    • たとえpcm32などの違う形式であろうと常に16bitでデータが返される
    • データがバイトのチャンクとして読み出されるので、自分で配列に変換する必要がある
    • チャンネル数が間違っている場合がある(1ch, 2chのファイルに対してのみ利用すべき)
    • エラーやワーニングのメッセージが出ない

とのことです(最新のバージョンを追っている訳ではないので改善されているかもしれませんが)。

自分でも簡単に触ってみましたが、確かにfrombufferで16bitずつ読み出したりshortをfloatに直したりするのが面倒です。

audioreadのテスト

とはいえ3系で動作するというのが大きな利点であるとは思います。

pydub(2015/5/25追記)

特に触っていませんがpydubというライブラリがあります。 サンプル単位ではなくms単位で扱うようなので厳密な計算を行いたい時には向いていないかもしれません。

jiaaro/pydub @ GitHub

pysox

これも特に触ることができていませんがlibsoxのpythonラッパーだと思われます。

Pysox audio manipulation for python documentation — pysox v0.3.5.alpha documentation

PySoundFile

audiolabのissuesのコメントでもはやメンテナンスされてないからこちらを使えと紹介されていたものです。 ぱっと見たところブロック(フレーム)単位でオーバーラップを指定して切り出せるのが便利そうです。

github.com

まとめ

wave, scipy.io.wavfile, scikits.audiolab, audioreadの4つを紹介しました。 個人的には量子化ビット数24bitのデータなどを読む際にwaveを使おうとしてハマった経験があるので、scikits.audiolabを推して行きたいところです。 scikits.audiolabはwindowsだとplay関数が使えないのが地味に不便だったりもするので時間があれば実装したいところです。 また、3系でも2系でも使いたいのであればaudioreadといったところでしょうか。

2015/5/25追記 audioreadよりはPySoundFIleの方が良いのではないかというissueがあります

https://github.com/cournape/audiolab/issues/28#issuecomment-104188186

またこれ以外にもwaveファイルを読む方法をご存知の方は教えていただけると幸いです。

pip install scipyしてコケる時

mountain lionでpip install scipyしたのにranlib: archive member: build/temp.macosx-10.8-x86_64-2.7/libarpack_scipy.a(znaup2.o) cputype (7) does not match previous archive members cputype (16777223) (all members must match)と表示されてscipyのインストールが成功しないときは

$ export CC=clang; export CXX=clang; export FFLAGS=-ff2c
$ pip install scipy

で無事インストールされる(公式にちゃんと載ってる)。

7/6追記

この情報は最早古く上記リンク先にはexportの記述は見当たらなくなっている。 brew install gfortranでgfortranを入れた上でpip install scipyを実行したら普通にインストールされた。 なお手元の環境ではbrew linkしろと言われたのでbrew link --overwrite gfortranシンボリックリンクを作成した上でpipを実行した。