2017-08-15 8 views
1

私は4次元の配列を持っています.4次元を「時間」次元とみなします。連続するフレームは、最初の2つの次元を使用して2Dヒートマップとしてプロットされています。あなたは「アニメーション」を取得しています。実行時間を測定すると、かなり低い26フレームで16秒間を取得しています。どのようにして、以下のコードの実行時間を短縮できますか? matplotlibの代わりにSeabornを使ってヒートマップを作成したいと思っています(後者の拡張でも)。Seabornヒートマップ実行時間の最適化をプロットする

import numpy as np 
import matplotlib.pyplot as plt 
import seaborn as sns 
import time 

data = np.load('data.npy') 

fig = plt.figure() 
ax = fig.add_subplot(111) 
im = sns.heatmap(np.zeros((256, 128)), cmap = 'viridis', vmin = 0, vmax = 90) 
plt.show(block = False) 

start = time.time() 
for i in range (0, data[0, 0, 0, :].size): 
    plt.clf() 
    sns.heatmap(20*np.log10(abs(data[:, :, 2, i])), cmap = 'viridis', vmin = 0, vmax = 90) 
    fig.canvas.draw() 
end = time.time() 

print(end - start) 
+0

どのように事前に計算について: '20 * np.log10( np.abs(data)) 'を実行する前にループ内に入り、ループ内の演算を使用する必要はありませんか? – Divakar

+0

良いアイデア - それは約4秒で改善しました - 今26フレームが11.7秒で表示されます。いくつかのデータ:https://drive.google.com/open?id=0B6ksYqU-Jy7sRkczaVBLS3NuOUU –

+0

私は約12.5Hzのフレームレートが必要です - このデータセットの全体の表示時間は約2-3秒でなければなりません。 –

答えて

1

次のコードは、(実行時間=約2秒)seabornとまったく同じプロットを生成するが、10倍の高速化:

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.animation as animation 
from mpl_toolkits.axes_grid1 import make_axes_locatable 
import time 

data = np.load('data.npy') 
data = 20*np.log10(abs(data)) 

fig = plt.figure(figsize = (7, 7)) 
ax = fig.add_subplot(111) 

#initialise subfigure (dimensions and parameters) 
im = ax.imshow(np.zeros((256, 128)), cmap = 'viridis', vmin = 0, vmax = 90, interpolation = 'none', aspect = 'auto') 

#get rid of spines and fix range of axes, rotate x-axis labels 
ax.spines['left'].set_visible(False) 
ax.spines['right'].set_visible(False) 
ax.spines['top'].set_visible(False) 
ax.spines['bottom'].set_visible(False) 
ax.xaxis.set_ticks_position('bottom') 
ax.yaxis.set_ticks_position('left') 
ax.xaxis.set_ticks(np.arange(0, 128, 5)) 
ax.yaxis.set_ticks(np.arange(0, 256, 10)) 
for tick in ax.get_xticklabels(): 
    tick.set_rotation(90) 

#use a divider to fix the size of the colorbar 
divider = make_axes_locatable(ax) 
#colorbar on the right of ax. Colorbar width in % of ax and space between them is defined by pad in inches 
cax = divider.append_axes('right', size = '5%', pad = 0.07) 
cb = fig.colorbar(im, cax = cax) 
#remove colorbar frame/spines 
cb.outline.set_visible(False) 

#don't stop after each subfigure change 
plt.show(block = False) 

#loop through array 
start = time.time() 
for i in range(data[0, 0, 2, :].size): 
    time.sleep(0.005) 
    im.set_array(data[:, :, 0, i]) 
    fig.canvas.draw() 
stop = time.time() 
print(stop-start) 
関連する問題