これは、既存の回答のマイナーな改良に加えて、列名ではなく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
デフォルトでに設定されるオプションのキャスト引数があることに注意してください。これにより、floatを整数にキャストするときに誤って精度が失われないよう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
また、floatを整数に、またはその逆に変更する一般的なケースでは、np.issubdtype
複数の特定のdtypeに対してチェックするのではなく、で一般的な数値タイプをチェックすることをお勧めします。