えー、気づけばずいぶん書いていませんね・・・。
書きたいことのストックはあって
- NIPS13のRapid distance-based outlier detectionの解説
- Bayesian for Hackersの続き
ぐらいは書く時間さえ取れればかけるんですけど・・・*1
でも久々に書きます。
Python全然慣れない私にとって良い福音となりそうな話があったので。
まずは、どうも慣れないリスト内包表記(List Comprehensions *2 )について。
元々の説明は
5. Data Structures — Python v2.7.8 documentation
にありますね。ここ、filterとかlambdaとかもあって大事かもしれません。
とにかく、リスト内包表記ってこういうやつですね。
>>> import numpy as np
# for文>>> squares = np.zeros(10)
>>> for d in xrange(10):
... squares[d] = d**2
...
>>> squares
array([ 0., 1., 4., 9., 16., 25., 36., 49., 64., 81.])# list内包表記
>>> squares2 = [x**2 for x in xrange(10)]
>>> squares2
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
for文で書きたくなっちゃうよ
やっぱりリストを扱うときはどんどんfor文で書きたくなるのですが、
蛇使いとしては下策らしいですね・・・。
Pythonを高速化するCythonを使ってみた - Kesin's diary
この記事はCythonの喜びを語っていらっしゃいますが、リストをfor文appendで増やすよりは内包表記で書いた方が早いよとも書いてありました。
でも、ちょっと難しいのです・・・まず読めない。
良い読み方
で、何かいい読み方の説明がないかなぁと思って調べたら
こちらの記事で、「数学の集合表記そのものだよ!」という良いお言葉が。
では
5. Data Structures — Python v2.7.8 documentation
の例をそうやって解読してみましょうか・・・。
>>> D = [-4, -2, 0, 2, 4]
>>> S1 = [x*2 for x in D]
>>> S1
[-8, -4, 0, 4, 8]
>>> S2 = [x for x in D if x >= 0]
>>> S2
[0, 2, 4]
ここで、Dは全要素(元)の集合で、S1, S2はそれを元にして生成した集合ですね。
数式で書くと、
ややっ、これはわかりやすいかもですね!