データ収集中にint型に文字列をパースすることがあったのですが、みるからに数値なのにエラーが返ってきました。これは何気にドツボでした。
ValueErrorの発生
エラーを招いたコードの例がこちら
a = np.array(['1.0', '2.0']).astype('int16')
実際に出たエラーがこちらです。
ValueError: invalid literal for int() with base 10:
エラー読んでもいまいち理解できませんでした。
正しくないリテラル...どういうこっちゃ!?
【原因】文字列が小数だった
原因は意外にもシンプルで、文字列の形が小数だったからみたいです...
他のコードで確認してみると
a = np.array(['1', '2']).astype('int16')
# >> array([1, 2], dtype=int16
a = np.array(['1.0', '2.0']).astype('float32')
# >> array([1, 2], dtype=float32)
小数であった時、floatへの変換はうまくいっているようです。
改善策
いったんfloatに変換してから、intに変換するとできます。遠回りですが。
a = np.array(['1.0', '2.0']).astype('float32').astype('int16')
# >> array([1, 2], dtype=int16)
このようなエラーに直面したら、配列の中身の文字列が少数になっていないか確認してみましょう!!