Error [module 'numpy' has no attribute 'float']

AttributeError: module 'numpy' has no attribute 'float' の直し方(numpy 1.24 で別名が削除された)

FIX SUMMARY verified
Applies when
python:3.11-slimnumpy >=1.24 (np.float/np.int/np.object/np.str/np.complex aliases removed and still gone on 2.x; np.bool/np.long removed in 1.24–1.26 but revived in numpy 2.0)using np.float/np.int/np.object/np.str/np.complex on numpy 1.24+ (np.bool/np.long only on 1.24–1.26; revived on 2.x); own code or an old third-party library; numpy pulled up by a dependency

Verified: reproduced in python:3.11-slim, then the module 'numpy' has no attribute 'float' signature was gone after the fix (exit 0).

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.intnp.objectnp.strnp.complex でも同じ形(... has no attribute 'int' など)で出ます。これは、numpy が 1.24 でこれらの別名を削除したために起きます。

なぜ削除されたのか

np.floatnp.int は、Python 組み込みの floatintただの別名でした(np.floatfloat と同じ、np.intint と同じ)。紛らわしく実益も無いため、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.floatfloat に、np.intint に置き換えます。挙動は変わりません。

# 変更前
arr = np.array(data, dtype=np.float)
# 変更後
arr = np.array(data, dtype=float)

対応は次のとおりです。

削除された別名置き換え(組み込み)numpy のスカラ型が要るとき
np.floatfloatnp.float64
np.intintnp.int_(または np.int64
np.objectobjectnp.object_
np.strstrnp.str_
np.complexcomplexnp.complex128

dtype=np.float のような使い方は dtype=float にします。numpy 配列の要素型を細かく指定したい場合だけ np.float64 などの実体型を使います。整数のスカラ型は、幅を固定したいなら np.int64、既定幅でよければ np.int_(プラットフォーム依存)を選びます。どちらに直すか迷ったら、まず floatint へ。エラーメッセージが「安全で挙動を変えない」と言っているのはこちらです。

np.bool(と np.long)だけは扱いが違うので、上の表から外しています。この 2 つは 1.24 でいったん削除されましたが、numpy 2.0 で復活したため、numpy 2.x ではこのエラーになりません。復活しなかったのは np.floatnp.intnp.objectnp.strnp.complex のほうで、これらは 2.x でも AttributeError になります。したがって np.bool が無いのは numpy 1.24〜1.26 の間だけです。この範囲の numpy を使っているなら、np.boolbool(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.intnp.objectnp.strnp.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.floatnp.intnp.objectnp.complex などをコード全体で検索して洗い出します。第三者ライブラリ内なら直し方2です。
  • numpy を下げたのに、他のパッケージが動かなくなった:新しいパッケージが numpy>=1.24 や numpy 2.x を要求しているケースです。numpy を下げる方向でなく、直し方1(コード/ライブラリ更新)へ切り替えます。

検証環境

  • python:3.11-slim、ネットワーク有り
  • 再現:numpy==1.26.4np.array([1], dtype=np.float) を実行すると、module 'numpy' has no attribute 'float' を出して終了コード 1
  • 修正:同じ numpy==1.26.4np.array([1], dtype=float) にすると、終了コード 0

再現から修正までは errfix の検証ハーネスが機械的に確認しています。ここでは numpy の版を下げずに、案内どおり np.floatfloat に直すと同じ numpy で通ることを、再現から消滅まで通しました。境界が numpy 1.24 であることは、numpy<1.24(1.23.5)では同じ np.floatDeprecationWarning つきで動くことを確かめて裏づけています。エラー文言は実機出力から引用しています。別名の削除が 1.24 であることや、np.intnp.complex などの対応、np.boolnp.long が numpy 2.0 で復活したことは、機械検証の対象は上記に限り、一般的な情報として NumPy のリリースノート(1.20 の非推奨・1.24 の削除・2.0 での np.bool 復活)に沿って書いています。

検証(machine-verified)

この修正は python:3.11-slim のバージョン固定コンテナ内で再現し、修正後に module 'numpy' has no attribute 'float' のシグネチャが消えることを機械で確認しています。

verify — run-case.mjs
$ node run-case.mjs python/numpy-no-attribute-float
● reproduce module 'numpy' has no attribute 'float' present ✓
● apply fix exit 0
● re-run module 'numpy' has no attribute 'float' gone ✓
PASS verified · python:3.11-slim · signature gone