[Numpy-discussion] mrecarray

Michael Droettboom mdroe@stsci....
Mon Jul 14 12:53:09 CDT 2008


I'm running into a couple of small problems with mrecarray.  I'm not 
sure if they're bugs or a usage error.

First, the constructor throws an exception when the format string 
contains nested arrays (if that is the proper term) such as "(2,2)f8".  
This creates a three-element tuple in the dtype.descr list, whereas the 
mrecord.py code seems to assume each descr will always have 2 elements. 

========

In [1]: from numpy.ma import mrecords

In [2]: x = mrecords.mrecarray(1, formats="(2,2)f8")
---------------------------------------------------------------------------
<type 'exceptions.ValueError'> Traceback (most recent call last)

/wonkabar/data1/scraps/<ipython console> in <module>()

/home/mdroe/usr/lib/python2.5/site-packages/numpy/ma/mrecords.py in 
__new__(cls, shape, dtype, buf, offset, strides, formats, names, titles, 
byteorder, aligned, mask, hard_mask, fill_value, keep_mask, copy, **options)
121 self = recarray.__new__(cls, shape, dtype=dtype, buf=buf, offset=offset,
122 strides=strides, formats=formats,
--> 123 byteorder=byteorder, aligned=aligned,)
124 #
125 mdtype = [(k,'|b1') for (k,_) in self.dtype.descr]

/home/mdroe/usr/lib/python2.5/site-packages/numpy/core/records.py in 
__new__(subtype, shape, dtype, buf, offset, strides, formats, names, 
titles, byteorder, aligned)
248
249 if buf is None:
--> 250 self = ndarray.__new__(subtype, shape, (record, descr))
251 else:
252 self = ndarray.__new__(subtype, shape, (record, descr),

/home/mdroe/usr/lib/python2.5/site-packages/numpy/ma/mrecords.py in 
__array_finalize__(self, obj)
157 _fieldmask = getattr(obj, '_fieldmask', None)
158 if _fieldmask is None:
--> 159 mdescr = [(n,'|b1') for (n,_) in self.dtype.descr]
160 objmask = getattr(obj, '_mask', nomask)
161 if objmask is nomask:

<type 'exceptions.ValueError'>: too many values to unpack

========

In my own use case, I don't care if the individual elements of the 
nested array are maskable -- either the whole array being masked or not 
is good enough -- but perhaps that shortcoming is why this wasn't 
designed to work?  I have attached a patch to mrecords.py that gets me 
past this and does seem to allow the nested array to be masked as a whole.

Secondly, the "names" and "titles" kwargs seem to be ignored by the 
mrecarray constructor.

========

In [3]: x = mrecords.mrecarray(1, formats="f8", names="foo")

In [4]: x[0]['foo'] = 42.0
---------------------------------------------------------------------------
<type 'exceptions.ValueError'> Traceback (most recent call last)

/wonkabar/data1/scraps/<ipython console> in <module>()

/home/mdroe/usr/lib/python2.5/site-packages/numpy/ma/mrecords.py in 
__setitem__(self, indx, value)
309 def __setitem__(self, indx, value):
310 "Sets the given record to value."
--> 311 MaskedArray.__setitem__(self, indx, value)
312 if isinstance(indx, basestring):
313 self._mask[indx] = ma.getmaskarray(value)

/home/mdroe/usr/lib/python2.5/site-packages/numpy/ma/core.py in 
__setitem__(self, indx, value)
1437 # raise IndexError, msg
1438 if isinstance(indx, basestring):
-> 1439 ndarray.__setitem__(self._data, indx, value)
1440 ndarray.__setitem__(self._mask, indx, getmask(value))
1441 return

<type 'exceptions.ValueError'>: field named foo not found.

========

The included patch delegates these kwargs onto the underlying recarray.

Cheers,
Mike

-- 
Michael Droettboom
Science Software Branch
Operations and Engineering Division
Space Telescope Science Institute
Operated by AURA for NASA
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: mrecords.py.diff
Url: http://projects.scipy.org/pipermail/numpy-discussion/attachments/20080714/d31adb0e/attachment.pl 


More information about the Numpy-discussion mailing list