Pythonの内包表記


前回、左の画像データを複素数の集合に変換してガウス平面に描写するという課題を行った。

次の課題で描写した模様を左にπ(パイ) / 4回転したものを半分にスケーリングしたものを表示する

というものがあった。


スケーリングは描写で利用した各複素数の値を1/2にすれば良くて、


>>> from plotting import plot
>>> from image import file2image
>>> data = file2image("img01.png")
>>> pts = {(x+(189 - y)*1j) for (y, d) in enumerate(data) for (x, v) in enumerate(d) if v[0] < 121}
>>> scale = {c / 2 for c in pts}
>>> plot(scale, 180)

http://resources.codingthematrix.com/のThe Fieldにある各ファイルを利用しています。


前回、作成したpts変数に対して、

再度内包表記で各複素数を1/2したものをscale変数に格納してplotすると、



半分にスケーリングされた模様が描写された。




次に回転だけど、

回転は各複素数にeθiでθに指定の角度を指定したものをかければ良い。


ここで指定するeθiはガウス平面に円を書くためのcosθ + i*sinθと一致して

eθi = cosθ + i*sinθというオイラーの公式がある。


右辺の三角関数の波は合わせることによって円として描写されるので、

eθiのθに角度を代入して、その値を各複素数にかけることによって回転するのはなんとなくイメージできる。


早速試してみる。

回転はπ/4にするため、


>>> from plotting import plot
>>> from image import file2image
>>> from math import e, pi
>>> data = file2image("img01.png")
>>> rotate = {c*(e**(pi/4*1j)) for c in pts}
>>> plot(rotate, 180)

前回、作成したpts変数に対して、

再度内包表記で各複素数にeπ/4iしたものをrotate変数に格納してplotすると、



π / 4(45度)分、左に傾いた描写が表示された。




最後にスケールと回転を同時に行ってみる。


>>> from plotting import plot
>>> from image import file2image
>>> from math import e, pi
>>> data = file2image("img01.png")
>>> scale_rotate = {c/2*(e**(pi/4*1j)) for c in pts}
>>> plot(scale_rotate, 180)


出来た。