gpt4 book ai didi

python-3.x - 缓慢的 matplotlib - 将图保存到 PNG

转载 作者:行者123 更新时间:2023-12-04 04:24:11 25 4
gpt4 key购买 nike

快速总结 : matplotlib savefig 对于 PNG 来说太慢了。 ...寻找关于如何加快速度的想法/想法,或替代图书馆(chaco?cairo?)

更新:在底部添加了一些(非常粗略和准备好的)代码来说明。

我正在使用 matplotlib(python 3.x,四核 macbook 上的最新 anaconda)通过 imshow() 创建单个 1024x1024 np 数组(int16 的)的绘图.我的目标是简单地在磁盘上生成一个带注释的图像文件(不需要交互式显示)。

轴设置为完全填充图形(因此没有样条/抽动等)并且 dpi/大小组合设置为匹配数组的大小 - 因此没有缩放/插值等。

在单个轴的顶部,我显示 3 个文本区域和几个 (~6) 矩形块。

...所以从绘图的角度来看,没有什么特别的,而且非常简单。

但是,当我将图形(使用 savefig )保存为 PNG 时,大约需要 1.8 秒(!!!)。
...保存为 raw 或 jpg 都在大约 0.7 秒左右。

我尝试将后端切换到 Agg,但这将 savefig() 的时间增加到大约 2.1 秒

我认为这太慢是错误的吗?我更愿意保存为 PNG,而不是 JPG - 但我不明白为什么 PNG 比 JPG 慢得多。我的目标是在 AWS 上部署,所以在这里很关心速度。

周围有没有更快的图书馆? (我不想要交互式 UI 绘图,只是基本的保存到文件绘图)

下面是一些粗略和准备好的代码,大致说明了这一点。我机器上的输出是:

current backend: MacOSX
default save: 0.4048
default save - float64: 0.3446
full size figure: 0.8105
full size figure - with text/rect: 0.9023
jpg: full size figure - with text/rect: 0.7468
current backend: agg
AGG: full size figure - with text/rect: 1.3511
AGG: jpg: full size figure - with text/rect: 1.1689

我无法(即使经过反复尝试)获取示例代码来重现我在我的应用程序中看到的 ~1.7 秒(处理时间)savefig(),但我认为下面的代码仍然说明了 a) jpg 比png(或者相反,png 看起来很慢)b)它看起来仍然很慢(imo)

所以我不应该期待比这更快的吗? ……这就是速度吗?
有没有更快的后端可用?
当我在 AWS (linux) 上部署时,最好/最快的后端是什么?
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon, Rectangle
import time

def some_text(ax):
pm = u'\u00b1'
string = f'blah\nblah {pm}blah\nblah blah blah'
ax.text(10, 10, string, color='red', ha='left')
ax.text(990, 990, string, color='green', ha='right')
ax.text(500, 500, string, color='green', ha='center')
ax.text(500, 500, string, color='green', ha='center', va='top', fontsize=10)
ax.text(800, 500, string, color='green', ha='center', multialignment='center', fontsize=16)

def some_rect(ax):
rect = Rectangle((10,10),width=100, height=100, color='red', fill=False)
ax.add_patch(rect)
rect = Rectangle((300,10),width=100, height=100, color='yellow', fill=False)
ax.add_patch(rect)
rect = Rectangle((300,600),width=50, height=50, color='yellow', fill=False)
ax.add_patch(rect)
rect = Rectangle((800,600),width=50, height=50, color='yellow', fill=False)
ax.add_patch(rect)

dim = 1024
test = np.arange(dim*dim).reshape((dim, dim))
dpi = 150
inches = test.shape[1]/dpi, test.shape[0]/dpi

print('current backend:', matplotlib.get_backend())

plt.imshow(test)
c0 = time.process_time()
plt.savefig('test.png')
print(f'default save: {(time.process_time()-c0):.4f}')
plt.close()

fig, ax = plt.subplots(figsize=inches, dpi=dpi)
fig.subplots_adjust(left=0, right=1, top=1, bottom=0, wspace=0, hspace=0)
ax.imshow(test)
c0 = time.process_time()
plt.savefig('test3.png')
print(f'full size figure: {(time.process_time()-c0):.4f}')

fig, ax = plt.subplots(figsize=inches, dpi=dpi)
fig.subplots_adjust(left=0, right=1, top=1, bottom=0, wspace=0, hspace=0)
ax.imshow(test)
some_text(ax)
some_rect(ax)
c0 = time.process_time()
plt.savefig('test4.png')
print(f'full size figure - with text/rect: {(time.process_time()-c0):.4f}')

fig, ax = plt.subplots(figsize=inches, dpi=dpi)
fig.subplots_adjust(left=0, right=1, top=1, bottom=0, wspace=0, hspace=0)
ax.imshow(test)
some_text(ax)
some_rect(ax)
c0 = time.process_time()
plt.savefig('test5.jpg')
print(f'jpg: full size figure - with text/rect: {(time.process_time()-c0):.4f}')

backend = 'agg'
matplotlib.use(backend, force=True)
import matplotlib.pyplot as plt
print('current backend: ', matplotlib.get_backend())


fig, ax = plt.subplots(figsize=inches, dpi=dpi)
fig.subplots_adjust(left=0, right=1, top=1, bottom=0, wspace=0, hspace=0)
ax.imshow(test)
some_text(ax)
some_rect(ax)
c0 = time.process_time()
plt.savefig('test6.png')
print(f'AGG: full size figure - with text/rect: {(time.process_time()-c0):.4f}')


fig, ax = plt.subplots(figsize=inches, dpi=dpi)
fig.subplots_adjust(left=0, right=1, top=1, bottom=0, wspace=0, hspace=0)
ax.imshow(test)
some_text(ax)
some_rect(ax)
c0 = time.process_time()
plt.savefig('test7.jpg')
print(f'AGG: jpg: full size figure - with text/rect: {(time.process_time()-c0):.4f}')


最佳答案

尝试制作 PIL图像对象,对我来说它比 matplotlib 快 100 多倍:

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt

data = np.random.random((100, 100))
cm = plt.get_cmap('viridis')
img = Image.fromarray((cm(data)[:, :, :3] * 255).astype(np.uint8))
img.save('image.png')

如果你只想要灰度,你可以跳过 get_cmap业务 - 只需将您的数组扩展到 0 到 255 的范围内。

必须在 PIL 中添加注释。 .

与使用 matplotlib 的一个重要区别是像素对像素。因此,如果您想应用一些缩放,则必须先进行插值。您可以使用 scipy.ndimage.zoom 为了那个原因。

关于python-3.x - 缓慢的 matplotlib - 将图保存到 PNG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58231354/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com