質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

1回答

1939閲覧

matplotlibで作成したグラフ(画像データ)のnumpy行列を高速に取得したい

tonberi

総合スコア4

canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/02/28 03:55

前提・実現したいこと

最終目標:pythonで、左にゲーム画面、右にグラフが描画されている動画をファイルとして出力したい
実装方法:numpy行列(静止画)のリストを作り、そのリストを使って動画にしようとしています。numpy行列(静止画)の作り方はゲームのエミュレータからゲーム画面のnumpy行列を、matplotlibのpyplotからグラフを作成し、それを変換してnumpy行列を取得してそれら2つのnumpy行列を合体させて作っています。

しかし、下記のプログラムでは動作がとても遅くなってしまいます(forループで回すため)。何か高速化する方法がありましたら教えていただければ幸いです。
自分ではfig.canvas.draw()の部分で一度描画をしてしまっているためだと考えておりますが、描画をしないでnumpy行列を取得する方法が分かりません。

発生している問題

とにかく遅い。

該当のソースコード

python

1def hoge(self, frame): 2 plt.close('all') 3 x = np.linspace(0, 2*np.pi, 21) 4 y1 = np.sin(x) 5 y2 = np.cos(x) 6 y3 = y1-y2 7 fig, ax = plt.subplots() 8 ax.plot(x, y1, 'b.-') 9 ax.plot(x, y2, 'g,-.') 10 ax.plot(x, y3, 'r,-.') 11 print(plt.__file__) 12 fig.canvas.draw() 13 im = np.array(fig.canvas.renderer.buffer_rgba()) 14 im = cv2.cvtColor(im, cv2.COLOR_RGBA2RGB) 15 im = resize(im, (210,160,3)) 16 im = (im*255).astype(np.uint8) 17 synthesis = np.concatenate([frame, im], 1) 18 self.VIDEO_HEIGHT = self.GAME_HEIGHT 19 self.VIDEO_WIDTH = self.GAME_WIDTH + 160 20 return synthesis

試したこと

fig.canvas.draw()が遅い原因だと思い、消してみましたがエラーが出てできませんでした。

補足情報(FW/ツールのバージョンなど)

python3.6.7
matplotlib3.1.2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

下記のプログラムでは動作がとても遅くなってしまいます

「とても遅い」とは実際どのくらい遅いのでしょうか?
各処理の時間を計測として、具体的にコードの何行目がボトルネックになっているのか特定してください。

【Python】処理にかかる時間を計測して表示 - Qiita

自分ではfig.canvas.draw()の部分で一度描画をしてしまっているためだと考えておりますが、描画をしないでnumpy行列を取得する方法が分かりません。

この関数が呼ばれたタイミングで初めてグラフが画像化されるので、描画しないで、画像化したグラフを得ることはできないです。

matplotlib 自体がそもそもかなり遅いライブラリです。
グラフを静止画で作成する目的ならそれでも困らないのですが、リアルタイムに高速にグラフを作成する必要がある場合はそもそも向いていないと思います。

投稿2020/02/28 04:34

tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問