2017-08-15 2 views
1

Ich habe ein 4D numpy Array, betrachten die 4. Dimension als die "Zeit" Dimension. Aufeinanderfolgende Frames werden als zweidimensionale Heatmap gezeichnet, wobei die ersten beiden Dimensionen verwendet werden - Sie erhalten eine "Animation". Wenn ich die Ausführungszeit bemesse, bekomme ich 16 Sekunden für 26 Frames, was ziemlich niedrig ist. Wie kann ich die Ausführungszeit des unten stehenden Codes beschleunigen? Ich würde es vorziehen, Seaborn zu verwenden, um die Heatmaps anstelle von Matplotlib zu erstellen (obwohl es eine Erweiterung von letzterem ist).Seaborn Heatmap Plotten Ausführungszeit Optimierung

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

Wie wäre es pre-compute: '20 * np.log10 (np.abs (data)) 'bevor Sie in die Schleife gehen und diese innerhalb der Schleife verwenden, ohne dass die Berechnung involviert ist? – Divakar

+0

Gute Idee - es wurde um 4 Sekunden verbessert - jetzt werden 26 Bilder in 11,7 Sekunden angezeigt. Einige Daten: https://drive.google.com/open?id=0B6ksYqU-Jy7sRkczaVBLS3NuOUU –

+0

Ich brauche eine Bildrate von etwa 12,5 Hz - die gesamte Anzeigezeit für dieses Dataset sollte etwa 2-3 Sekunden betragen. –

Antwort

1

Der folgende Code erzeugt genau die gleiche Handlung wie Seaborn, aber 10-mal schneller (Ausführungszeit = ca. 2 Sekunden):

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)