John Hunter wrote:
I have a record array r and I want to add a new field to it. I have been looking at setfield but I am not sure how to use it for this purpose. Eg
# r is some npy record array N = len(r) x = npy.zeros(N) # add array of floats x to r with dtype name 'jdh' and type '<f8'
Any suggestions?
Here is the straightforward way:
In [15]: import numpy as np
In [16]: dt = np.dtype([('foo', int), ('bar', float)])
In [17]: r = np.zeros((3,3), dtype=dt)
In [18]: r Out[18]: array([[(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)]], dtype=[('foo', '<i4'), ('bar', '<f8')])
In [19]: def append_field(rec, name, arr, dtype=None): arr = np.asarray(arr) if dtype is None: dtype = arr.dtype newdtype = np.dtype(rec.dtype.descr + [(name, dtype)]) newrec = np.empty(rec.shape, dtype=newdtype) for field in rec.dtype.fields: newrec[field] = rec[field] newrec[name] = arr return newrec ....:
In [29]: append_field(r, 'jdh', ones((3,3))) Out[29]: array([[(0, 0.0, 1.0), (0, 0.0, 1.0), (0, 0.0, 1.0)], [(0, 0.0, 1.0), (0, 0.0, 1.0), (0, 0.0, 1.0)], [(0, 0.0, 1.0), (0, 0.0, 1.0), (0, 0.0, 1.0)]], dtype=[('foo', '<i4'), ('bar', '<f8'), ('jdh', '<f8')])