[Numpy-discussion] masked_array/matplotlib issue with memmaps
Christopher Burns
cburns at berkeley.edu
Tue Feb 26 18:26:34 EST 2008
If I initialize an AxesImage using a np.zeros array and then set the
axes data later to a np.memmap array, I get a RuntimeError when
matplotlib tries to autoscale the image. The errors continue to fill
my console and I'm forced to close the shell. This bug was introduced
when I switched from numpy v1.0.3.1 to the trunk v1.0.5.dev4815
The two hacks to get around this are:
1) Setting any array element to something other than zero fixes the error:
zdata[0,0] = 1
2) Specify the extent and max/min values when creating the image:
imgaxes = pylab.imshow(zdata, extent=(0, data_shape[1],
data_shape[0], 0), vmin=0, vmax=1)
Unfortunately, due to the way this errors I'm having a difficult time
debugging it. I'm hoping someone with in-depth knowledge of
masked_arrays will have some insight.
Code and output are below.
Thanks!
Chris
---- script to reproduce the bug ----
import pylab
import numpy as np
def printinfo(imgaxes):
a = imgaxes.get_array()
print '\nimgaxes array info:'
print 'type', type(a)
print 'shape', a.shape
print 'dtype', a.dtype
print 'has _mmap', hasattr(a, '_mmap')
data_type = 'float32'
data_shape = (30, 40)
zdata = np.zeros(data_shape, dtype=data_type)
#zdata[0,0] = 1 # No exception raised if this line is executed
imgaxes = pylab.imshow(zdata)
printinfo(imgaxes)
mmdata = np.memmap('foo.dat', dtype=zdata.dtype, shape=zdata.shape, mode='w+')
imgaxes.set_data(mmdata)
printinfo(imgaxes) # imgaxes array now has a _mmap
pylab.show()
---- version info ----
In [2]: pylab.matplotlib.__version__
Out[2]: '0.91.2'
In [4]: numpy.version.version
Out[4]: '1.0.5.dev4817'
---- error ----
In [26]: run memmap_reassign.py
imgaxes array info:
type <class 'numpy.ma.core.MaskedArray'>
shape (30, 40)
dtype float32
has _mmap False
imgaxes array info:
type <class 'numpy.ma.core.MaskedArray'>
shape (30, 40)
dtype float32
has _mmap True
Exception exceptions.RuntimeError: 'maximum recursion depth exceeded'
in ignored
ERROR: An unexpected error occurred while tokenizing input
The following traceback may be corrupted or invalid
The error message is: ('EOF in multi-line statement', (10, 0))
---------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
/Users/cburns/local/lib/python2.5/site-packages/matplotlib/backends/backend_wx.pyc
in _onPaint(self, evt)
1079 self.realize()
1080 # Render to the bitmap
-> 1081 self.draw(repaint=False)
1082 # Update the display using a PaintDC
1083 self.gui_repaint(drawDC=wx.PaintDC(self))
/Users/cburns/local/lib/python2.5/site-packages/matplotlib/backends/backend_wxagg.pyc
in draw(self, repaint)
59 """
60 DEBUG_MSG("draw()", 1, self)
---> 61 FigureCanvasAgg.draw(self)
62
63 self.bitmap =
_convert_agg_to_wx_bitmap(self.get_renderer(), None)
/Users/cburns/local/lib/python2.5/site-packages/matplotlib/backends/backend_agg.pyc
in draw(self)
356
357 self.renderer = self.get_renderer()
--> 358 self.figure.draw(self.renderer)
359
360 def get_renderer(self):
/Users/cburns/local/lib/python2.5/site-packages/matplotlib/figure.pyc
in draw(self, renderer)
622
623 # render the axes
--> 624 for a in self.axes: a.draw(renderer)
625
626 # render the figure text
/Users/cburns/local/lib/python2.5/site-packages/matplotlib/axes.pyc in
draw(self, renderer, inframe)
1303 mag = renderer.get_image_magnification()
1304 ims = [(im.make_image(mag),0,0)
-> 1305 for im in self.images if im.get_visible()]
1306
1307
/Users/cburns/local/lib/python2.5/site-packages/matplotlib/image.pyc
in make_image(self, magnification)
129 im.is_grayscale = False
130 else:
--> 131 x = self.to_rgba(self._A, self._alpha)
132 im = _image.fromarray(x, 0)
133 if len(self._A.shape) == 2:
/Users/cburns/local/lib/python2.5/site-packages/matplotlib/cm.pyc in
to_rgba(self, x, alpha, bytes)
74 x = ma.asarray(x)
75 x = self.norm(x)
---> 76 x = self.cmap(x, alpha=alpha, bytes=bytes)
77 return x
78
/Users/cburns/local/lib/python2.5/site-packages/matplotlib/colors.pyc
in __call__(self, X, alpha, bytes)
431 vtype = 'array'
432 xma = ma.asarray(X)
--> 433 xa = xma.filled(0)
434 mask_bad = ma.getmask(xma)
435 if xa.dtype.char in npy.typecodes['Float']:
/Users/cburns/local/lib/python2.5/site-packages/numpy/ma/core.pyc in
filled(self, fill_value)
1542 m = self._mask
1543 if m is nomask or not m.any():
-> 1544 return self._data
1545 #
1546 if fill_value is None:
/Users/cburns/local/lib/python2.5/site-packages/numpy/ma/core.pyc in
_get_data(self)
1472
1473 """
-> 1474 return self.view(self._baseclass)
1475 _data = property(fget=_get_data)
1476 data = property(fget=_get_data)
/Users/cburns/local/lib/python2.5/site-packages/numpy/core/memmap.pyc
in __array_finalize__(self, obj)
204 self._mmap = obj._mmap
205 else:
--> 206 raise ValueError, 'Cannot create a memmap from
object %s'%obj
207 else:
208 self._mmap = None
/Users/cburns/local/lib/python2.5/site-packages/numpy/ma/core.pyc in
__str__(self)
1614 m = self._mask
1615 if m is nomask:
-> 1616 res = self._data
1617 else:
1618 if m.shape == ():
/Users/cburns/local/lib/python2.5/site-packages/numpy/ma/core.pyc in
_get_data(self)
1472
1473 """
-> 1474 return self.view(self._baseclass)
1475 _data = property(fget=_get_data)
1476 data = property(fget=_get_data)
/Users/cburns/local/lib/python2.5/site-packages/numpy/core/memmap.pyc
in __array_finalize__(self, obj)
204 self._mmap = obj._mmap
205 else:
--> 206 raise ValueError, 'Cannot create a memmap from
object %s'%obj
207 else:
208 self._mmap = None
/Users/cburns/local/lib/python2.5/site-packages/numpy/ma/core.pyc in
__str__(self)
1614 m = self._mask
1615 if m is nomask:
-> 1616 res = self._data
1617 else:
1618 if m.shape == ():
/Users/cburns/local/lib/python2.5/site-packages/numpy/ma/core.pyc in
_get_data(self)
1472
1473 """
-> 1474 return self.view(self._baseclass)
1475 _data = property(fget=_get_data)
1476 data = property(fget=_get_data)
/Users/cburns/local/lib/python2.5/site-packages/numpy/core/memmap.pyc
in __array_finalize__(self, obj)
204 self._mmap = obj._mmap
205 else:
--> 206 raise ValueError, 'Cannot create a memmap from
object %s'%obj
207 else:
208 self._mmap = None
.... [snip]
/Users/cburns/local/lib/python2.5/site-packages/numpy/ma/core.pyc in
_get_data(self)
1472
1473 """
-> 1474 return self.view(self._baseclass)
1475 _data = property(fget=_get_data)
1476 data = property(fget=_get_data)
RuntimeError: maximum recursion depth exceeded
Exception exceptions.AttributeError: "'memmap' object has no attribute
'_mmap'" in ignored
Exception exceptions.AttributeError: "'memmap' object has no attribute
'_mmap'" in ignored
[snip]
Exception exceptions.AttributeError: "'memmap' object has no attribute
'_mmap'" in <bound method memmap.__del__ of memmap([ 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0.])> ignored
Exception exceptions.AttributeError: "'memmap' object has no attribute
'_mmap'" in <bound method memmap.__del__ of memmap([ 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0.])> ignored
[snip]
More information about the NumPy-Discussion
mailing list