我需要从数据开始向磁盘保存很多(比方说一百万)图像。
我可以使用matplotlib
实现此目的,但过程很慢。
我描述了我的脚本,发现瓶颈就是这些线:
ax = plt.Axes(fig, [0., 0., 1., 1.])
fig.clf()
我的数据为numpy.array
,形状为56 x 56。
以下是代码:
import matplotlib as mpl
mpl.use('Agg')
import numpy as np
import matplotlib.pyplot as plt
for i in range(num_events):
image = create_camera_image(evts, i) # this gives me back the image in a numpy.array of shape 56 x 56
fig = plt.figure(frameon=False)
fig.set_size_inches(1, 1)
ax = plt.Axes(fig, [0., 0., 1., 1.]) # most expensive line
ax.set_axis_off()
fig.add_axes(ax)
ax.imshow(image, filternorm=90, interpolation='nearest', origin='lower', cmap='hot')
fig.savefig('filename'+str(i)+'.png', dpi=224)
fig.clf() # second most expensive line
有更高效的方法吗?
我相信matplotlib 不是最好的选择,但我不能使用pillow
或opencv
之类的其他库来实现相同的结果。
答案 0 :(得分:1)
创建图形,轴和图像一次肯定更有效,只用新数据更新它,而不是为每个图像创建它们。
import matplotlib as mpl
mpl.use('Agg')
import numpy as np
import matplotlib.pyplot as plt
num_events = 10
def create_camera_image(i):
return np.random.rand(56,56)
fig = plt.figure(figsize=(1,1),frameon=False)
ax = fig.add_axes([0,0,1,1])
ax.set_axis_off()
nullimage = np.zeros((56,56))
im = ax.imshow(nullimage, interpolation='nearest', origin='lower',
cmap='hot', vmin=0,vmax=1)
for i in range(num_events):
image = create_camera_image(i)
im.set_data(image)
fig.savefig('filename'+str(i)+'.png', dpi=224)