Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用matplotlib.pyplot.imsave将numpy.ndarray保存为图像(.png)时出错_Python_Python 2.7_Numpy_Matplotlib - Fatal编程技术网

Python 使用matplotlib.pyplot.imsave将numpy.ndarray保存为图像(.png)时出错

Python 使用matplotlib.pyplot.imsave将numpy.ndarray保存为图像(.png)时出错,python,python-2.7,numpy,matplotlib,Python,Python 2.7,Numpy,Matplotlib,如何将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) 以下是完整的错误输出: ---------------------------------------------------

如何将
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)
---------------------------------------------------------------------------
TypeError回溯(最近一次调用上次)
在()
---->1 imsave('out.png',test)
/imsave中的usr/lib/pymodules/python2.7/matplotlib/pyplot.pyc(*args,**kwargs)
1751@docstring.copy\u dedent(\u imsave)
1752 def imsave(*args,**kwargs):
->1753返回_imsave(*args,**kwargs)
1754
1755 def matshow(A,fignum=无,**千瓦):
/imsave中的usr/lib/pymodules/python2.7/matplotlib/image.pyc(fname、arr、vmin、vmax、cmap、format、origin、dpi)
1229
1230 figsize=[x/float(dpi)表示arr.shape中的x[:-1]]
->1231图=图(figsize=figsize,dpi=dpi,frameon=False)
1232画布=图画布(图)
1233 im=fig.figimage(arr,cmap=cmap,vmin=vmin,vmax=vmax,origin=origin)
/usr/lib/pymodules/python2.7/matplotlib/figure.pyc in_u__________(self、figsize、dpi、facecolor、edgecolor、线宽、frameon、subplotpars)
266 self.dpi\u scale\u trans=Affine2D()
267 self.dpi=dpi
-->268 self.bbox_英寸=bbox.from_界限(0,0,*figsize)
269 self.bbox=转换的bbox(self.bbox_英寸,self.dpi_刻度_trans)
270
TypeError:from_bounds()正好接受4个参数(给定5个)
您可以使用PIL:

import Image
import numpy as np

test = np.zeros((500, 750, 3), np.int8)
im = Image.fromarray(test, 'RGB')
im.save('test.png')

您看到的错误原因是回溯中的这一行:

1230     figsize = [x / float(dpi) for x in arr.shape[::-1]]
您的数组是三维的,因此
figsize
将是长度为3的列表。稍后,此列表将在
Bbox.from_bounds()
的参数中解压缩:

Bbox.from_bounds()
需要4个参数,但由于
figsize
的长度是3,它将得到5个参数,因此会出现错误

此错误仅影响RGB(A)图像阵列,-如果将matplotlib版本更新为1.3.1或更高版本,问题将消失


当然,还有很多其他方法可以将numpy数组保存到图像文件中,您可以始终使用PIL(如@enrico.bascis的回答),或者@JohnZwink链接到的问题中的另一种方法。

如果您向我们展示了从何处导入
imsave
,则可能会有帮助。@John Zwinck-您是对的。它应该是
dtype=numpy.uint8
。但即使这样,
imsave
也不起作用。@ali\m-函数
imsave
来自
matplotlib.pyplot
--> 268         self.bbox_inches = Bbox.from_bounds(0, 0, *figsize)