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)
| 703 | |
| 704 | |
| 705 | def addfield(mrecord, newfield, newfieldname=None): |
| 706 | """Adds a new field to the masked record array |
| 707 | |
| 708 | Uses `newfield` as data and `newfieldname` as name. If `newfieldname` |
| 709 | is None, the new field name is set to 'fi', where `i` is the number of |
| 710 | existing fields. |
| 711 | |
| 712 | """ |
| 713 | _data = mrecord._data |
| 714 | _mask = mrecord._mask |
| 715 | if newfieldname is None or newfieldname in reserved_fields: |
| 716 | newfieldname = f'f{len(_data.dtype)}' |
| 717 | newfield = ma.array(newfield) |
| 718 | # Get the new data. |
| 719 | # Create a new empty recarray |
| 720 | newdtype = np.dtype(_data.dtype.descr + [(newfieldname, newfield.dtype)]) |
| 721 | newdata = np.recarray(_data.shape, newdtype) |
| 722 | # Add the existing field |
| 723 | [newdata.setfield(_data.getfield(*f), *f) |
| 724 | for f in _data.dtype.fields.values()] |
| 725 | # Add the new field |
| 726 | newdata.setfield(newfield._data, *newdata.dtype.fields[newfieldname]) |
| 727 | newdata = newdata.view(MaskedRecords) |
| 728 | # Get the new mask |
| 729 | # Create a new empty recarray |
| 730 | newmdtype = np.dtype([(n, np.bool) for n in newdtype.names]) |
| 731 | newmask = np.recarray(_data.shape, newmdtype) |
| 732 | # Add the old masks |
| 733 | [newmask.setfield(_mask.getfield(*f), *f) |
| 734 | for f in _mask.dtype.fields.values()] |
| 735 | # Add the mask of the new field |
| 736 | newmask.setfield(ma.getmaskarray(newfield), |
| 737 | *newmask.dtype.fields[newfieldname]) |
| 738 | newdata._mask = newmask |
| 739 | return newdata |
searching dependent graphs…