Это небольшое уточнение существующих ответов, а также расширение ситуаций, в которых вы хотите внести изменение на основе 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' )
Более подробную информацию о casting
можно найти в документации numpy для astype идругие параметры.
Также обратите внимание, что для общих случаев изменения чисел с плавающей точкой на целые числа или наоборот вы можете предпочесть проверять общий тип чисел с помощью np.issubdtype
, а не проверять несколько разных типов dtypes.