¿Cómo crear una matriz estructurada uniforme en numpy?

Podría crear la siguiente matriz estructurada en numpy:

dt = np.dtype([('n', 'i4'),('x', 'f8'), ('y', 'f8'), ('z', 'f8')])
arr = np.array((1, 5.0, 6.0, 7.0)) 

Esto crea la matriz:

array((1, 5., 6., 7.), dtype=[('n', '<i4'), ('x', '<f8'), ('y', '<f8'), ('z', '<f8')])

En dtlas últimas tres columnas, todas son flotantes . f8¿Hay una forma más corta de declarar dtcuando hay varias columnas consecutivas del mismo tipo?

Answer

No más rápido, pero puede crear una función auxiliar para generar dtype:

def gen_dtype(names, override=None, default='f8'):
    d = dict(zip(names, [default]*len(names)))
    d.update(override)
    return np.dtype(list(d.items()))

dt  = gen_dtype(list('nxyz'), {'n': 'i4'})

Producción:

>>> dt
dtype([('n', '<i4'), ('x', '<f8'), ('y', '<f8'), ('z', '<f8')])

Un método alternativo es usar el formato de diccionario para definir el tipo de d:

dt2 = np.dtype( {'names': ['n','x','y','z'],
                 'formats': ['i4'] + ['f8']*3} )