numpy を新しくしてから、np.float を使っているところで次のエラーが出て止まることがあります。
AttributeError: module 'numpy' has no attribute 'float'.
`np.float` was a deprecated alias for the builtin `float`. To avoid this error in existing code, use `float` by itself.
np.int・np.object・np.str・np.complex でも同じ形(... has no attribute 'int' など)で出ます。これは、numpy が 1.24 でこれらの別名を削除したために起きます。
なぜ削除されたのか
np.float や np.int は、Python 組み込みの float・int のただの別名でした(np.float は float と同じ、np.int は int と同じ)。紛らわしく実益も無いため、numpy は 1.20(2021 年)で非推奨にし、1.24(2022 年 12 月)で削除しました。削除後にこれらを参照すると、__getattr__ が AttributeError を投げます。
エラーメッセージ自身が直し方を案内しています。float そのものを使えばよく、挙動は変わりません。numpy のスカラ型が必要なときだけ np.float64 を使います。
なぜ numpy 1.24 以降で出るのか
同じコードでも、numpy が 1.24 より前なら通ります(DeprecationWarning は出ますが動きます)。エラーになるのは numpy を 1.24 以降に上げた後です。手元やこれまでの環境が古い numpy のままなら踏みません。次のような形で、意図せず新しい numpy に上がって表面化します。
- 別のライブラリを入れたら numpy も上がった:新しいパッケージが
numpy>=1.24を要求し、依存解決で numpy が引き上げられます。 requirements.txtで numpy を固定していない:範囲指定や無指定だと、最新(1.24 以降や 2.x)が入ります。- 新しい環境・CI・イメージで作り直した:手元は古いまま、CI やコンテナだけ新しい numpy になっている、という差が出ます。
自分で numpy を上げた覚えがなくても、依存に引きずられて上がっていれば同じことが起きます。
直し方1:コードを直す(基本)
エラーメッセージのとおり、np.float を float に、np.int を int に置き換えます。挙動は変わりません。
# 変更前
arr = np.array(data, dtype=np.float)
# 変更後
arr = np.array(data, dtype=float)
対応は次のとおりです。
| 削除された別名 | 置き換え(組み込み) | numpy のスカラ型が要るとき |
|---|---|---|
np.float | float | np.float64 |
np.int | int | np.int_(または np.int64) |
np.object | object | np.object_ |
np.str | str | np.str_ |
np.complex | complex | np.complex128 |
dtype=np.float のような使い方は dtype=float にします。numpy 配列の要素型を細かく指定したい場合だけ np.float64 などの実体型を使います。整数のスカラ型は、幅を固定したいなら np.int64、既定幅でよければ np.int_(プラットフォーム依存)を選びます。どちらに直すか迷ったら、まず float/int へ。エラーメッセージが「安全で挙動を変えない」と言っているのはこちらです。
np.bool(と np.long)だけは扱いが違うので、上の表から外しています。この 2 つは 1.24 でいったん削除されましたが、numpy 2.0 で復活したため、numpy 2.x ではこのエラーになりません。復活しなかったのは np.float・np.int・np.object・np.str・np.complex のほうで、これらは 2.x でも AttributeError になります。したがって np.bool が無いのは numpy 1.24〜1.26 の間だけです。この範囲の numpy を使っているなら、np.bool は bool(numpy スカラが要るなら np.bool_)へ置き換えてください。
直し方2:直せないのが依存ライブラリのとき
エラーが出ているのが自分のコードではなく、入れた第三者ライブラリの中(古いライブラリが np.float を使っている)なら、コードは直せません。
- そのライブラリを新しくする:
pip install --upgrade <ライブラリ>。多くは numpy 1.24 対応の版が出ています。まずこれを試します。 - どうしても上げられないなら、numpy を一時的に下げる:
pip install "numpy<1.24"。ただし numpy 1.23 系は古く、他の新しいパッケージと衝突することがあるので、これはライブラリを更新するまでのつなぎです。
pip install "numpy<1.24"
なお numpy<1.24(=1.23.5)には Python 3.11 までの wheel しか無く、Python 3.12 以降には入りません(3.12 に対応した最初の numpy は 1.26 です)。そのため Python 3.12+ ではこの「numpy を下げる」回避は使えず、直し方1(コード修正/ライブラリ更新)で対処します。
新しい numpy を保ったままにできる直し方1(コード側/ライブラリ更新)が本筋で、numpy を下げるのは当座の回避に留めます。
切り分け(うまくいかないとき)
np.int・np.object・np.str・np.complexでも同じエラーが出る:どれも 1.24 で削除され、numpy 2.x でも復活していない別名です。上の表のとおり組み込み型へ置き換えます。np.bool(とnp.long)だけは numpy 2.0 で復活しているので、このエラーになるのは numpy 1.24〜1.26 のときだけです。- エラーが
A module that was compiled using NumPy 1.x cannot be run in NumPy 2.xになっている:それは別名の削除ではなく、コンパイル済み拡張の ABI 非互換(numpy 2.0)です。原因も対処も別で、A module that was compiled using NumPy 1.x … を参照してください。 np.floatを消したのに、まだ同じエラーが出る:別の箇所やインポートされたモジュールに残っています。np.float・np.int・np.object・np.complexなどをコード全体で検索して洗い出します。第三者ライブラリ内なら直し方2です。- numpy を下げたのに、他のパッケージが動かなくなった:新しいパッケージが
numpy>=1.24や numpy 2.x を要求しているケースです。numpy を下げる方向でなく、直し方1(コード/ライブラリ更新)へ切り替えます。
検証環境
python:3.11-slim、ネットワーク有り- 再現:
numpy==1.26.4でnp.array([1], dtype=np.float)を実行すると、module 'numpy' has no attribute 'float'を出して終了コード 1 - 修正:同じ
numpy==1.26.4でnp.array([1], dtype=float)にすると、終了コード 0
再現から修正までは errfix の検証ハーネスが機械的に確認しています。ここでは numpy の版を下げずに、案内どおり np.float を float に直すと同じ numpy で通ることを、再現から消滅まで通しました。境界が numpy 1.24 であることは、numpy<1.24(1.23.5)では同じ np.float が DeprecationWarning つきで動くことを確かめて裏づけています。エラー文言は実機出力から引用しています。別名の削除が 1.24 であることや、np.int/np.complex などの対応、np.bool・np.long が numpy 2.0 で復活したことは、機械検証の対象は上記に限り、一般的な情報として NumPy のリリースノート(1.20 の非推奨・1.24 の削除・2.0 での np.bool 復活)に沿って書いています。