如何将 numpy.ndarray 导出为图形文件(png、jpg、...)?
当我尝试以下操作时:
test = zeros((500, 750, 3), dtype=numpy.uint8)
imsave('out.png',test)
我收到这个错误:
TypeError: from_bounds() takes exactly 4 arguments (5 given)
下面是完整的错误输出:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-5-ff0e3e551b72> in <module>()
----> 1 imsave('out.png',test)
/usr/lib/pymodules/python2.7/matplotlib/pyplot.pyc in imsave(*args, **kwargs)
1751 @docstring.copy_dedent(_imsave)
1752 def imsave(*args, **kwargs):
-> 1753 return _imsave(*args, **kwargs)
1754
1755 def matshow(A, fignum=None, **kw):
/usr/lib/pymodules/python2.7/matplotlib/image.pyc in imsave(fname, arr, vmin, vmax, cmap, format, origin, dpi)
1229
1230 figsize = [x / float(dpi) for x in arr.shape[::-1]]
-> 1231 fig = Figure(figsize=figsize, dpi=dpi, frameon=False)
1232 canvas = FigureCanvas(fig)
1233 im = fig.figimage(arr, cmap=cmap, vmin=vmin, vmax=vmax, origin=origin)
/usr/lib/pymodules/python2.7/matplotlib/figure.pyc in __init__(self, figsize, dpi, facecolor, edgecolor, linewidth, frameon, subplotpars)
266 self.dpi_scale_trans = Affine2D()
267 self.dpi = dpi
--> 268 self.bbox_inches = Bbox.from_bounds(0, 0, *figsize)
269 self.bbox = TransformedBbox(self.bbox_inches, self.dpi_scale_trans)
270
TypeError: from_bounds() takes exactly 4 arguments (5 given)
请您参考如下方法:
您看到的错误原因是回溯中的这一行:
1230 figsize = [x / float(dpi) for x in arr.shape[::-1]]
你的数组是 3 维的,所以 figsize 将是一个长度为 3 的列表。稍后,这个列表在 Bbox.from_bounds() 的参数中被解包:
--> 268 self.bbox_inches = Bbox.from_bounds(0, 0, *figsize)
Bbox.from_bounds() 需要 4 个参数,但由于 figsize 的长度为 3,它会得到 5 个参数,因此会出现错误。
此错误仅影响 RGB(A) 图像数组,and was fixed in this commit - 如果将 matplotlib 版本更新到 1.3.1 或更高版本,问题就会消失。
当然,还有很多其他方法可以将 numpy 数组保存到图像文件中,并且您始终可以使用 PIL(如@enrico.bascis 的回答),或@JohnZwink 链接到的问题中的其他方法之一相反。
