EDIT: note it is not completely obvious what is right, since it may not be so easy to ensure that, e.g., erfa.cpv produces output with the same field names as the input.
Right now, the erfa functions insist on the correct field names:
In [14]: pv1 = np.array([([0.,1.,2.], [3.,4.,5.])], dtype=np.dtype([('p', '3f8'), ('v', '3f8')]))
In [15]: pv2 = np.array(([5.,4.,3.], [2.,1.,0.]), dtype=np.dtype([('pos', '3f8'), ('vel', '3f8')]))
In [16]: erfa.cpv(pv1)
Out[16]:
array([([0., 1., 2.], [3., 4., 5.])],
dtype={'names':['p','v'], 'formats':[('<f8', (3,)),('<f8', (3,))], 'offsets':[0,24], 'itemsize':48, 'aligned':True})
In [17]: erfa.cpv(pv2)
TypeError: ufunc 'cpv' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''same_kind''
Yet, numpy works by position and allows e.g. the following:
In [18]: pv1[:] = pv2
In [19]: pv1
Out[19]:
array([([5., 4., 3.], [2., 1., 0.])],
dtype=[('p', '<f8', (3,)), ('v', '<f8', (3,))])