NumPy のバージョンがあがるらしいのでシュッと確認しておく

ちゃっす(/・ω・)/


Python 触ってるとまぁほぼ使ってるであろう NumPy ちゃんの 2.0 がでるので自分用のメモがてらシュッとまとめておくのである(/・ω・)/


詳細はリリースノートをご覧あれ


This major release includes breaking changes that could not happen in a regular minor (feature) release - including an ABI break, changes to type promotion rules, and API changes which may not have been emitting deprecation warnings in 1.26.x. Key documents related to how to adapt to changes in NumPy 2.0, in addition to these release notes, include:

https://numpy.org/devdocs/release/2.0.0-notes.html


前提として、このバージョンアップによって色々かわるから注意しなはれよ~という感じ


ので、使用する NumPy のバージョン指定してない場合はメンテナンスしましょうね~(/・ω・)/


注意ポイントは別途資料みてね~みたいな


とりあえずハイライト部分をペロッと翻訳

新機能:

  • 可変長文字列の新しいデータ型 `StringDType` と、文字列操作のための高性能な ufunc を備えた新しい `numpy.strings` 名前空間を追加。

  • すべての `numpy.fft` 関数で `float32` と `longdouble` のサポートを追加。

  • メインの `numpy` 名前空間で `array API` 標準をサポート。

パフォーマンスの向上:

  • ソート関数(`sort`、`argsort`、`partition`、`argpartition`)は、Intel x86-simd-sort と Google Highway ライブラリを使用して高速化され、ハードウェア固有の大幅な速度向上が見込まれる。

  • macOS Accelerate のサポートと macOS >=14 向けのバイナリホイールにより、macOS 上での線形代数操作のパフォーマンスが大幅に向上し、ホイールサイズも約3倍小さくなる。

  • `numpy.char` の固定長文字列操作は、固定長文字列データ型に加え `StringDType` をサポートする ufunc を実装することで高速化された。

  • 使用可能なハードウェア固有カーネルを判別し、それらにディスパッチするための新しいトレーシングとインスペクション API `opt_func_info` を追加。

Python API の改善:

  • パブリック API とプライベート API の明確な分離、新しいモジュール構造、各パブリック関数が単一の場所で利用可能。

  • 非推奨関数とエイリアスの多くを削除。これにより NumPy の学習と使用が容易に。メイン名前空間のオブジェクト数が約10%、`numpy.lib` のオブジェクト数が約80%減少。

  • 標準的なデータ型名と新しい introspection 関数 `isdtype` を追加。

C API の改善:

  • カスタムデータ型を作成するための新しいパブリック C API を追加。

  • 多くの古い関数とマクロを削除し、プライベートな内部を隠すことで将来的な拡張性を向上。

  • 新しく使いやすい初期化関数 `PyArray_ImportNumPyAPI` と `PyUFunc_ImportUFuncAPI` を追加。

動作の改善:

  • タイププロモーションの動作が NEP 50 を採用して変更された。これにより、入力配列のデータ値ではなくデータ型のみに依存するプロモーションの驚きを修正。この変更は出力データ型の変更や混合データ型操作での精度低下を引き起こす可能性があるため、詳細は NEP と NumPy 2.0 マイグレーションガイドを参照。

  • Windows のデフォルト整数型が他のプラットフォームと同様に `int32` から `int64` に変更。

  • 配列の最大次元数が 32 から 64 に変更。

ドキュメント:

  • リファレンスガイドのナビゲーションが大幅に改善され、NumPy のモジュール構造に関するドキュメントが追加。

  • ソースからのビルドドキュメントが完全に書き直された。


基本的に内容としてはいい感じ~なのですが既存の API とか機能とか型なんかが削除されたり非推奨になったりしてるので新しいのを使う場合は頑張って修正する必要がありますのよん(/・ω・)/


で、一番気になるどうやって修正したらいいですのん( ・ω・)?


が移行ガイドに書いてて


とりあえず Ruff で置換する


`ruff>=0.2.0` をインストールして、`pyproject.toml` に `NPY201` ルールを追加。

[tool.ruff.lint]
select = ["NPY201"]

ほいで実行

$ ruff check path/to/code/ --select NPY201


普通に Python をちょろっと使ってるだけだとこれだけでよさそう(/・ω・)/


その他気にしといた方がよさそうなやーつ(/・ω・)/

NumPy 2.0 は、NumPy 1.26 で作成されたピクルファイルを読み込むように設計されており、その逆も同様です。しかし、NumPy 1.25 以前のバージョンでは、NumPy 2.0 のピクルファイルを読み込むと例外が発生します。

copy キーワードの変更への対応

asarray、array、および ndarray.array の copy キーワードの動作が変更されているため、以下の変更が必要です:

np.array(..., copy=False) を使用しているコード:
多くの場合、np.asarray(...) に変更することができます。以前は np.array がデフォルトの np.asarray のコピーが必要な場合の動作よりもオーバーヘッドが少なかったため、このように使用されていましたが、現在では np.asarray が推奨される関数です。

NumPy 1.x および 2.x の両方で互換性を持たせるために None/False を渡す必要がある場合:
その方法の例については、scipy#20172 を参照してください。

非NumPyの配列ライクオブジェクトに対する array メソッド:
dtype=None および copy=None キーワードをシグネチャに追加する必要があります。これにより、古いバージョンの NumPy でも動作します(ただし、古いバージョンの NumPy は copy キーワードを渡しません)。キーワードを array シグネチャに追加すると以下の動作が適用されます:

copy=True および任意の dtype 値: 常に新しいコピーを返す。
copy=None: 必要に応じてコピーを作成する(例えば dtype によって)。
copy=False: コピーを絶対に作成しない。NumPy 配列を返すためにコピーが必要な場合や dtype を満たすためにコピーが必要な場合は例外(ValueError)を発生させる。


あとはまぁ変更してみてエラーになったらリリースノートをちゃんと読みまひょ(/・ω・)/



メモみたいなもんなのでとりあえずシュッと終わり。


この記事が気に入ったらサポートをしてみませんか?