画像データを一列の配列データに直して、FFTして、スペクトルを表示するから。
画像データ→ピクセルデータ(m行 n列)→配列データ(1行 m*n列)→abs(fft(配列データ))みたいな。
一昔前の16:9ディスプレイが1920*1080のサイズだった。
(この記事を書いている2011年製のPCが、そのサイズなので、一昔と書いたが、今でも標準かもしれない。ただ、最近使わせてもらったmacのディスプレイがこれより大きくてきれいだったので、今の標準はそっちなのかなぁと言う意味での一昔前)
これに目一杯表示するとデータサイズが、
1920*1080 = 2,073,600 ≒ 2 [M pixels]になる。
そういった作図に関しては、Pythonで作図するための定番モジュール"MatPlotlib"ではなく、"PyQtGraph"を使用する事にしている。
"FIR and FFT"のプログラムでも使ったから分かるけど、早いし。
pyqtgraphは、使い方がよく分からないっていう、最大の難点があるけどそんな事ない。
この記事を読んでもらえば、「・・・PyQtGraph使えないこともない。多分。」っていう状態になれると思う。
上記記事にも書いたが、大体↓このコマンド実行したら、pyqtgraphを使い始められるんじゃないかって程、色々出てくる。
しかもコード付きで。
import pyqtgraph.examples
pyqtgraph.examples.run()
MatplotlibとPyQtGraphを比較します。
・単純に同じグラフを描画する。
・時間は、こんな感じで表示させた。
#import other_modules
import time
time_1 = time.clock()
'''
code
'''
time_2 = time.clock()
print(str(time_2 - time_1)+" seconds")
こうすると、codeの部分にかかった時間が、端末上に表示されるので、メモる
codeの部分などに、いろいろ入れるという。
もちろん、QtDesignerで書いたコードなどは含めない。
ちなみに、どうなるのかというと。
>>> import time
>>> time_1 = time.clock()
>>> '''
... code
... '''
'\ncode\n'
>>> time_2 = time.clock()
>>> print(str(time_2 - time_1)+" seconds")
0.001606 seconds
となった。
繰り返している内に早くなってくることがあるので、for構文で何度もやった。
時間を自動的にメモするために、この様な感じで書いた。
a = open("pyqtgraph1.txt","wr")
a.write("time, mean time\n")
for i in range(100)
#省略
a.write(str(time_2 - time_1) + ", " + str(b/(i+1))+"\n")
#省略
a.close()
書いていて、途中で面倒くさくなったので、コードだけ書く。
注意
やれば分かると思うけど、matplotlibは、show()する度に消さないといけない。
pyqtgraphは、文字通り100窓になる。(終わったら自動的に消える。)

初めはmatplotlib
import time
import matplotlib.pyplot as plt
import pyqtgraph as pg
import numpy as np
x = np.linspace(0,1,1000001)
y = np.sin(np.linspace(0,4*np.pi,1000001))
a = open("matplotlib1.txt","wr")
a.write("time, mean time\n")
b = 0
for i in range(100):
time_1 = time.clock()
plt.plot(x,y)
plt.show()
time_2 = time.clock()
b = b + time_2 - time_1
a.write(str(time_2 - time_1) + ", " + str(b/(i+1))+"\n")
a.close()
次いで、pyqtgraph
import time
import matplotlib.pyplot as plt
import pyqtgraph as pg
import numpy as np
x = np.linspace(0,1,1000001)
y = np.sin(np.linspace(0,4*np.pi,1000001))
a = open("pyqtgraph1.txt","wr")
a.write("time, mean time\n")
b = 0
for i in range(100):
time_1 = time.clock()
c=pg.plot(x,y)
time_2 = time.clock()
c.close()
b = b + time_2 - time_1
a.write(str(time_2 - time_1) + ", " + str(b/(i+1))+"\n")
a.close()
結果
2周期分のsinカーブ100万1点
・matplotlib 0.22861378秒(100個やった平均)
・pyqtgraph 0.03074252秒(同上)
0.22861378/0.03074252
≒7
7倍早い。
pyqtgraphは、100回中一回目の描画は、0.13073秒もかかっている。
10回くらい描けば、後はそんなに変わらず0.03秒前後で終わる。
あれぇ…こんなはずじゃなかったんだけど。
もっと劇的な違いが出るはずだった。
前やったときは、ホワイトノイズがかなり多いデータを描かせていたせいかも。
y = np.sin(np.linspace(0,4*np.pi,1000001))となっているけど、こんなゆったりとしたデータじゃなくて、もっと激しく上下させてみたら、変わるのではないか。
そう思って
y = np.sin(np.linspace(0,10000*np.pi,1000001))にして、再度挑戦。

一万周期を1000ピクセル程度のグラフ幅で収めようとすると、もう何も見えない。
1万周期分のsinカーブ100万1点
matplotlib | pyqtgraph |
2.19913201124秒(90回やった平均。事情があって途中で止めた。) | 0.02954327(100回やった平均) |
2.19913201124/0.02954327
≒70
やりましたよ。
pyqtgraphはmatplotlibの70倍早いこともある。
もう少し複雑なら、さらに差が出るかもしれない。
(20160521修正)
タイトルとかが間違っていたので直した。
書いている最中に、やりたい内容が変わってきてしまう事が原因。
書く前に、何を書くのかはっきり決めていないのがそのそもの原因。
改めるつもりはない。
【pythonの最新記事】
- 中速フーリエ変換 ~離散フーリエ変換より..
- 断面二次モーメントを、座標点の配列から計..
- 断面二次モーメントを、座標点の配列から計..
- fontファイルの文字データ(グリフ)を..
- matplotlibのpyplot.pl..
- 計算力学技術者試験の問題集 自炊(裁断→..
- pythonで、ホワイトノイズやピンクノ..
- 脳ドッグに行ってきた。→MRIの画像デー..
- matplotlibのimshowで円を..
- matplotlibの、cmapを、徐々..
- matplotlibのmake_axes..
- matplotlib floatinga..
- matplotlib plotの色を、値..
- Pythonで、「二次元フーリエ変換した..
- matplotlibのlinestyle..
- どちらが正しいRGBか。(matplot..
- matplotlibのannotateの..
- matplotlibで、x軸とy軸の数字..
- VBAで、pythonのrangeとか、..
- matplotlibのaxes3Dで、a..
https://wakelet.com/wake/a6L5guaXPkg00ReeOy6VH
https://wakelet.com/wake/rNL3h-M2EPUyuQXz4TjLS
https://wakelet.com/wake/Cyjw-fdJKqEesN1oEk7QJ
https://wakelet.com/wake/SLvLCNv5CM7KuIZjE4YYa
https://wakelet.com/wake/pc-6S6rwpLO0fLdrGvz5f
https://wakelet.com/wake/BXra7-fL63-UDM4IMNwEk
https://wakelet.com/wake/jmWuhXcRV0UR5K4olHJtp
https://wakelet.com/wake/0XgLu5pnAyc-Bly23dAil
https://wakelet.com/wake/SeVpbCfIhFYn6eWRX9OZJ
https://wakelet.com/wake/W4t3sxjQj_eRZmUpMqpnm
https://wakelet.com/wake/zQT690WHPN61VS6mJYaCJ
https://wakelet.com/wake/LG0w0tf7tHCHMWDnfafzV
https://wakelet.com/wake/mnAd00LN6gkBioOvtV39k
https://wakelet.com/wake/RpgGAmiEEblcmCsUR7LYg
https://wakelet.com/wake/AnZBldCTvIjFF1AXtOjn0
https://wakelet.com/wake/q5U7mJRv3loJTC_2CPdVD
https://wakelet.com/wake/VvmSXCCi3UCqvkhuqgNCv
https://wakelet.com/wake/pJPh_L-6_GAWlVsC42AIk
https://wakelet.com/wake/UpYR-Cl7_bAa81he9jykJ
https://wakelet.com/wake/bQdfumzFuPAAYbX45AqCW
https://wakelet.com/wake/1ugp5IVulsXFu0itsZGdS
https://wakelet.com/wake/4oEcqys9ZJiQCdnQJF-lx
https://wakelet.com/wake/0qjTWQb8h85btvezw-B92