Adds a new field to the masked record array Uses `newfield` as data and `newfieldname` as name. If `newfieldname` is None, the new field name is set to 'fi', where `i` is the number of existing fields.
(mrecord, newfield, newfieldname=None)
| 747 | |
| 748 | |
| 749 | def addfield(mrecord, newfield, newfieldname=None): |
| 750 | """Adds a new field to the masked record array |
| 751 | |
| 752 | Uses `newfield` as data and `newfieldname` as name. If `newfieldname` |
| 753 | is None, the new field name is set to 'fi', where `i` is the number of |
| 754 | existing fields. |
| 755 | |
| 756 | """ |
| 757 | _data = mrecord._data |
| 758 | _mask = mrecord._mask |
| 759 | if newfieldname is None or newfieldname in reserved_fields: |
| 760 | newfieldname = 'f%i' % len(_data.dtype) |
| 761 | newfield = ma.array(newfield) |
| 762 | # Get the new data. |
| 763 | # Create a new empty recarray |
| 764 | newdtype = np.dtype(_data.dtype.descr + [(newfieldname, newfield.dtype)]) |
| 765 | newdata = recarray(_data.shape, newdtype) |
| 766 | # Add the existing field |
| 767 | [newdata.setfield(_data.getfield(*f), *f) |
| 768 | for f in _data.dtype.fields.values()] |
| 769 | # Add the new field |
| 770 | newdata.setfield(newfield._data, *newdata.dtype.fields[newfieldname]) |
| 771 | newdata = newdata.view(MaskedRecords) |
| 772 | # Get the new mask |
| 773 | # Create a new empty recarray |
| 774 | newmdtype = np.dtype([(n, bool_) for n in newdtype.names]) |
| 775 | newmask = recarray(_data.shape, newmdtype) |
| 776 | # Add the old masks |
| 777 | [newmask.setfield(_mask.getfield(*f), *f) |
| 778 | for f in _mask.dtype.fields.values()] |
| 779 | # Add the mask of the new field |
| 780 | newmask.setfield(getmaskarray(newfield), |
| 781 | *newmask.dtype.fields[newfieldname]) |
| 782 | newdata._mask = newmask |
| 783 | return newdata |