Python Kansai #1にスタッフとして参加しました
ここ最近は昨年から始めた個人ブログばかりを更新しており、このはてなブログはすっかり更新しなくなってしまいましたが、個人ブログの方では技術的な内容をメインで書いているのでこちらには多少個人的なことを書いていこうかと思っています。
Python Kansai#1の開催について
タイトルにもある通りPython Kansai #1にスタッフとして参加しました。ここではその経緯について少し記したいと思います。
事の発端は3/24に開催したはんなりPythonとPyData Osaka合同で開催した可視化特集会のあとの懇親会の場での会話でした。Pythonの勉強会は関西でいくつかあるがRuby関西みたいな大きめのイベントはないよね、名古屋にいたときのNGKのLT大会みたいに色んな勉強会合同で大きめのイベントができると良いのではないか、という話をしたところ、ないなら作れば良いではないかという話になり、その勢いで下記グループおよびイベントが作成されるということが起こりました。 kansai-python.connpass.com
上記イベントは単なるはんなりPythonの会のイベントへのリンクでしたが、その後、はんなりPythonの小川さん(id:mazarimono)が実際の開催に向けていろいろと動いてくださった結果、実際に開催にまでかこつけた形になります。 具体的には、
- 更に他の勉強会への声がけ
- スタッフおよび会場の日程調整
- 大阪イノベーションハブの確保
という超絶面倒と思われる全般的な調整作業を行ってくださいました。このイベントの開催が開催されたのは紛れもなく小川さんのおかげだと感じております。
当日のイベントページは下記のconpassのイベントです。100名以上の参加者があったことに驚きです。お越しいただいたみなさまありがとうございました。
なお、開催の経緯については小川さんのブログにも記事が載っています。
当日について
当日の全体的な様子についてはmedium上に作成したブログに記事がありますのでそちらを参照いただくのが良いかと思います。
当日の自分の役割としては一時的に受付を務めた以外はひたすら会場やスライド・登壇者の写真を最前列で撮影していました。よって必然的に最前線で各スピーカーの方々のお話を聞くことができ、スタッフ参加にもかかわらずイベント自体を非常に満喫することができました。各スピーカーの方々のお話は非常に興味深く、それに伴い活発な質疑応答がなされたことも印象的でした。シングルノードでも使えるのならとりあえずDaskに触ってみようと思ったり、Jetson Nanoを買うしかなかろう…という気分になりました。
コミュニティ紹介&LTも話題が多岐に渡るという点で非常に良かったと感じましたが、今回は時間が非常に押してしまったというのが全体的な反省点として挙げられると思うため、どう運営していくべきかについては要検討だと感じました。今後は今回のようなセミナー形式のイベントに限らずハッカソンなどもやっていこうという話となっているため、運営のノウハウを蓄積していく必要があるだろうといったところです。
その他感想
実はイベントの直前まで会社の大炎上業務に巻き込まれており、2週間で50h超の残業という残虐ファイトを繰り広げていたので非常にグロッキーなままスタッフ参加することになったのですが、結果としてスタッフとして参加できたことを誇りに思えるような素晴らしいイベントとなり、参加できて本当に良かったと感じた次第です。この思いを記録に残さねばという思いの下このブログを書いている感もあります。
一方で自身が運営として関わっているPyData Osakaはここのところオーガナイザーの不足に伴う慢性的な停滞感に包まれている感が否めません。実質動いているオーガナイザーが2名という今の状況は容易に消失しうる非常に危ういバランスの上で成り立っているため、安定した持続可能なコミュニティ形成のためにもテコ入れを図っていく必要があるだろうなと強く感じた次第です。
まとめ
なんだかんだ書きましたが楽しかったです。今後も継続して続けて開催できるように微力ながら協力していければなと思いました。
PyConJP2015の今更な参加記
昨年に引き続き2015/10/10-11に東京までPyConJP2015に参加しに行って来ました。開催から3週間経ってしまいましたが、やはり記録に留めておきたいと思ったため今更参加記を書きたいと思います。
1日目
会場は去年と一緒だったので特に迷わずに辿りつけました。
朝7時頃に伊丹空港を出て8時頃に羽田空港に着く飛行機に乗ったのでオープニングには無事に間に合いました。
keynote
- 資料
- 中継が上手く行かないか何かで一回やり直しになった
- アプリケーションのエラー検知、メトリクス、ロギングの話を非常に丁寧にしていた印象
強くなるためのプログラミング ープログラミングに関する様々なコンテストとそのはじめ方ー
- 資料
- Pythonアイドルくーむさんの発表
- 競技プログラミングの話をジャンル別(アルゴリズム、ゲームAI、データマイニング、セキュリティ、サーバインフラ)に分けて紹介
- アルゴリズム
- TopCoder, CodeForces, AtCoder
- pythonの再帰はデフォルトだと1,000回まで(sys.getrecursionlimit()で取得、sys.setrecursionlimit()で設定可能)
- ゲーム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の作者によるPythonがErlangから何が学べるかのトーク。
- 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分でサーバオペレーションコマンドを作る技術
- PyCon Canada 2015
- Djangoから各種チャットツールに通知するライブラリを作った話
- pandasによるデータ加工の注意点やライブラリの話
- 資料
- akashi.pyの存在を知った
- pandas_validatorというpandasのDataFrameに対するバリデーションを可能とするライブラリの紹介
- Dask: 軽量並列計算フレームワーク
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移行問題
- Diversity in Brazil
- PyConJPの舞台裏
- 舞台裏や予算についてなど
- 今年もEarlyBirdの時点で申し込めたので費用は8,000円で済んだのですが、パーティー代3,000円、弁当代1,000円x2だとすると3,000円だけで参加出来ているので非常に安く感じます。
- sqldf for pandas
- ソーシャルログインを補完: PayPal APIを使った信憑性の高いユーザーデータベースの構築
Closing
じゃんけん大会は一切勝てず何も貰えなかったがモノタロウ侍が可愛かったのでそれだけで良かった、そう、それだけで良かったんや…
終了後
帰りは新幹線で大阪へ。 酒飲みながら帰ったためかこの時に書いた文章がミスって消えたのが開催から3週間放置した一番の原因であるのは内緒。
戦利品
パンフレット類は割愛したので実際にはもっとある。
参考
ipython notebookで作成した資料のgithubへのアップロードおよびnbviewerでの閲覧
少し前から大阪PRML読書会で発表するために作成したipython notebookのipynbファイルをgithubにアップロードしている。
アップロードされたipynbファイルはnbviewerというサービスを通じて直接ブラウザ上で内容を見ることが可能であるが、書き溜めてはアップロードするという形が実際にノートにメモを取るかのようで謎の達成感を感じる。今年の内なる目標としてアウトプットを増やすというものがあるので、今後ともガンガンブログも書いてipynbもアップロードして、ゆくゆくはkagglerに進化したりウェブサービス作ったりハッカソンに参加したり主催したりしていきたいと願っている所存。
2015.05.25 追記
github上でipython notebookの内容が表示されるようになったため、nbviewer経由でなくとも直接github上で確認可能となった。
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の犬猫画像識別
- DeepLearningのFramework
- Theano/Pylearn2, cuda-convnet, OverFeat, Caffe, DeCAF
- Pythonがコア言語なのはPylearn2とDeCAF
- ライブラリによってPre-trained Networksという予め作成されたネットワークが利用できるかどうか違う
- Pepper君に何をして欲しいかを一つ考えよう
Gunicorn, the thundering herd and other concurrency programming challenges
- 資料
- gunicornはgreen unicornの略でUNIX向けのWSGI HTTPサーバ
- thundering herd problemをいかにして克服したか
- thundering herd problemとはイベントを待っている多くのプロセスがイベント発生時に全て動作しようとするが、同時に一つのプロセスしか処理ができない時に起こる問題のこと
- 全プロセスが一旦起きるが一つしか動作できないので他は再び寝てしまい、これを繰り返すことでシステムに負荷が掛かる
- thundering herd problemとはイベントを待っている多くのプロセスがイベント発生時に全て動作しようとするが、同時に一つのプロセスしか処理ができない時に起こる問題のこと
- チケット#792でhundering herdを解決
- arbiterとworkerの間でパイプを通じてシグナルをやりとり
- arbiterはsocketがreadできるかどうかをチェックし、workerはarbiterに仕事を要求するか生きていることをnotify
- arbiterとworkerの間でパイプを通じてシグナルをやりとり
- バージョン20.0では完全にgunicornコマンドのみになり、他のコマンド(gunicorn_djangoなど)については削除される予定
- ユーザエクスペリエンスの向上を現在進行形で取り組んでいるとのこと
- 前提知識が足りない、英語、途中から入った、という三重苦であまり理解できなかった
Lunch
弁当がでました(写真は撮り忘れた)
Data collection, analysis and optimization with python
- 過去の番組表からタレントの出現頻度を分析
- データ収集
- requests, bs4(BeautifulSoup4), (Selenium)を用いる
- データ分析
- pandas, scikit-learn
- 可視化
- 当初何故か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
Lightning Talk
- Gunosyの広告配信サーバ
- pydun
- 非エンジニアがPyConJPスタッフをしてみた
- 緊張していたと言っていたが人事らしいしっかりした話し方
- デプロイできる人事の存在に驚き
- Djangoの話
- 普段Djangoを書かないがためか何故かほぼ記憶にない
Party
- @mzmttksさんがリプライをくれたこともあって、そのまま色々輪が広がっていって色々な人と話せたのですごい良かった、世の中は狭い
2日目
Keynote: Hirokazu Nishio
- 若干遅刻したが大体聞けた
Job Fair
Poster Session
- 確率プログラミング
- PyMC3よりPyMC2の方がまだマシ、STANはオススメとのこと
Lunch
- 2日目はサンドイッチだった、レタスが豊富に含まれておりでかかった
OpenCVのpythonインターフェース入門
- 資料
- マイナビで連載をしているとのこと
- OpenCV
- import cv2
- 基本モジュールとしてcore, imageproc, highv?(マウス操作など)
- video(動画処理)、 calib3d(AR), ... 物体検出など
- mlもあるがサポートベクターマシン、ランダムフォレスト、GMMもあるがscikit-learnなどの方が良い
- OpenCV配列がnumpyとして保持される
- imread()
- 線形代数関連がそのまま使えるのがメリット
- 画像の可視化
- cv2.imshow()で実行可能
- matplotlibも使える
- 可視化するときだけBGRから変換が必要、内部的に扱うときはそのままでも良い
- ガウシアンブラー
- 自分で窓を定義しても良いが、OpenCVにも用意されている
- エッジ検出
- 動画の背景差分
- background.subtrackterなんちゃらですぐできる
- 人検出
- QA
Pythonとscikit-learnではじめる機械学習
- スパムフィルタの実装
- ナイーブベイズを使って分類
- scikit-learnのnaive_bayesのMultinomialで学習
- クロスバリデーションで評価
- 予測の説明は時間不足で端折られる
- 全体的にscikit-learnを用いるとコードが驚く程短くなる
- scikit-learnは異なる手法でもできるだけ同じインタフェースで学習やら予測ができるので学生時代に使いたかった
数理最適化によるパズルの解放
- ipython notebookでプレゼン
- 最適化問題を解くためのpulpというライブラリを使ってパズルを解く話
- pulpはモデラーであり、実際に問題を解くのは別に存在するソルバ
- LpProblem, LpVariable, LpAffineExpression, LpConstraintを使って問題を定義
- あとはvalue, lpSum, lpDotさえ使えれば大丈夫とのこと(ただし中身を理解できていないので何が大丈夫かは分からない)
- 数独やののぐらむ(ピクロス)などを制約を数式で定義して解く
- 人が解いたら楽しいがコンピュータに解かせても何も楽しくないとのこと
break
- 立話の中でmatplotlibはSliderなどの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クラスの一番下に書いてあるコードで一覧を出力可能です。
audioread(2015.2.11追記)
scikit.audiolabは2.7.x系でしか使えない(3系に対応したforkは存在)のですが、3.x系でも使えるライブラリとしてaudioreadというものがあります。
このライブラリはシステムにインストールされているさまざまなオーディオ関連のライブラリをバックエンドとして音声ファイルを読み込むことを可能とするライブラリで、現在は
- Gstreamer
- Core Audio(ctypes経由)
- MAD(pymadのバインディング)
- FFmpeg(コマンドラインツール)
wave
,aifc
,sunau
といったPython標準ライブラリ(非圧縮形式に対して利用)
が利用可能であるとのことです。
利点や使い方についてはこのnotebookに詳しく載っていますが、
- 良い点
- WAVEXのような形式にも対応
- WAVEXは多チャンネルに対応したWAVEの拡張フォーマット
- python2系でも3系でも利用可能
- WAVEXのような形式にも対応
- 悪い点
- たとえpcm32などの違う形式であろうと常に16bitでデータが返される
- データがバイトのチャンクとして読み出されるので、自分で配列に変換する必要がある
- チャンネル数が間違っている場合がある(1ch, 2chのファイルに対してのみ利用すべき)
- エラーやワーニングのメッセージが出ない
とのことです(最新のバージョンを追っている訳ではないので改善されているかもしれませんが)。
自分でも簡単に触ってみましたが、確かにfrombufferで16bitずつ読み出したりshortをfloatに直したりするのが面倒です。
とはいえ3系で動作するというのが大きな利点であるとは思います。
pydub(2015/5/25追記)
特に触っていませんがpydubというライブラリがあります。 サンプル単位ではなくms単位で扱うようなので厳密な計算を行いたい時には向いていないかもしれません。
pysox
これも特に触ることができていませんがlibsoxのpythonラッパーだと思われます。
Pysox audio manipulation for python documentation — pysox v0.3.5.alpha documentation
PySoundFile
audiolabのissuesのコメントでもはやメンテナンスされてないからこちらを使えと紹介されていたものです。 ぱっと見たところブロック(フレーム)単位でオーバーラップを指定して切り出せるのが便利そうです。
まとめ
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ファイルを読む方法をご存知の方は教えていただけると幸いです。