这是对现有答案的一个小改进,以及对您想要根据 dtype 而不是列名进行更改的情况的扩展(例如,将所有浮点数更改为整数)。
首先,您可以通过使用 listcomp 来提高简洁性和可读性:
col = 'age'
new_dtype = 'float64'
r.astype( [ (col, new_dtype) if d[0] == col else d for d in r.dtype.descr ] )
# rec.array([(b'Bill', 31.0, 260.0), (b'Fred', 15.0, 145.0)],
# dtype=[('name', 'S30'), ('age', '<f8'), ('weight', '<f4')])
其次,您可以扩展此语法以处理要将所有浮点数更改为整数(反之亦然)的情况。例如,如果您想将任何 32 位或 64 位浮点数更改为 64 位整数,您可以执行以下操作:
old_dtype = ['<f4', '<f8']
new_dtype = 'int64'
r.astype( [ (d[0], new_dtype) if d[1] in old_dtype else d for d in r.dtype.descr ] )
# rec.array([(b'Bill', 31, 260), (b'Fred', 15, 145)],
# dtype=[('name', 'S30'), ('age', '<i2'), ('weight', '<i8')])
请注意,它astype
有一个默认的可选转换参数,unsafe
因此您可能需要指定casting='safe'
以避免在将浮点数转换为整数时意外丢失精度:
r.astype( [ (d[0], new_dtype) if d[1] in old_dtype else d for d in r.dtype.descr ],
casting='safe' )
有关更多信息和其他选项,请参阅有关 astype 的 numpy 文档。casting
另请注意,对于将浮点数更改为整数或反之亦然的一般情况,您可能更愿意检查一般数字类型,np.issubdtype
而不是检查多个特定的 dtype。