メインコンテンツへスキップ
ActivePapers データを再計算可能なドキュメントとして保存。公開されたあらゆる結果の再実行、検証、および保存が可能になります。

当サイトの一部にはアフィリエイトリンクが含まれています。これらのリンク経由でご購入いただいた場合、追加費用なしで弊社に手数料が支払われることがありますが、推奨内容に影響はありません。詳細はアフィリエイト開示ページをご確認ください。 アフィリエイト開示.

データ サイエンティストのための NumPy: 実践ガイド

データ サイエンティスト向けの NumPy は、数値計算用の基本的な Python ライブラリです。これは、N 次元にわたるベクトル化された演算をサポートする固定タイプの連続メモリ ブロックである ndarray を提供します。 NumPy は 2006 年にリリースされ、現在バージョン 2.x が利用可能です。これは、pandas、SciPy、scikit-learn、そしてこれから触れるほぼすべての科学的な Python スタックを支えています。

重要なポイント

  • ndarray は、連続したバッファーに対する型付きのストライド ビューです。ストライドと dtype を理解すると、データ サイエンティストが NumPy を使用するときに遭遇するパフォーマンスとメモリの驚きのほとんどが説明されます。
  • ベクトル化は、一般的な数値ワークロードにおいて Python ループを 1 ~ 2 桁上回りますが、これは操作が NumPy のコンパイル済みカーネルにマップされる場合に限ります。
  • ブロードキャストは魔法ではなく、整列ルールのセットです。次元は右から左に比較され、等しいか 1 でなければなりません。
  • NumPy 2.0 では、Windows のデフォルトの整数型が変更され、プロモーション ルールが強化されたため、1.26 ではサイレントに動作していたコードが 2.x では dtype を変更したり、例外を発生させることがあります。
  • 表形式の作業の場合、通常は pandas が適切なレイヤーです。 NumPy は、配列、線形代数、信号処理、およびカスタム パイプラインの数値コアに適したレイヤーです。
  • メモリ レイアウト (C 順序と Fortran 順序) およびコピー対ビューのセマンティクスによって、10 GB 配列が RAM に収まるか、静かに 2 倍になるかが決まります。

データ サイエンスにおける NumPy とは正確には何ですか?

データ サイエンティスト向けの numpy アプローチの場合、スタックの残りの部分の下にあるアレイ基板として理解するのが最もよいでしょう。 pandas.DataFrame.to_numpy() を呼び出すか、scikit-learn 推定器をトレーニングするか、h5py で HDF5 ファイルのチャンクを読み取ると、データは ndarray に配置されます。この単一のオブジェクト タイプ (1 つの dtype、1 つのシェイプ、1 つのメモリ バッファー) によって、ダウンストリーム ライブラリが高速かつ予測可能になります。

ライブラリのスコープは初心者が予想するよりも狭いです。 NumPy は、ラベル付きデータ、欠損値セマンティクス、またはグループ化された集計を行いません。pandas がそれを行います。 NumPy は、最適化、補間、またはスパース線形代数を行いません。 SciPy がそれを行います。 NumPy は、高密度 N 次元配列、要素ごとの計算、ブロードキャスト、リダクション、インデックス付け、乱数生成、および BLAS および LAPACK への線形代数インターフェイスを実行します。その境界がどこにあるかを知ることで、NumPy 内でpandas を再実装するというよくある間違いを防ぐことができます。

ndarray: すべてを説明する 3 つの属性

ndarray は、「shape」、「dtype」、および「strides」という 3 つの要素によって記述されます。形状は論理的な次元です。 Dtype は、各要素 (float64、int32、complex128、datetime64[ns]、または構造化レコード) の解釈を決定します。ストライドは、各軸のステップにバイト オフセットを与えます。

arr[::2] と arr.T が無料である理由はストライドです。ステップまたは転置によるスライスではデータは移動されません。同じバッファ上で異なるストライドを持つ新しいビューを返します。 C 連続配列の再形成も同様にビューです。対照的に、ファンシーインデックス付け (arr[[0, 5, 9]]) とブール マスキングは常に新しい配列を割り当てます。マルチギガバイトの配列を処理するパイプラインでは、ビューとコピーの違いは、処理の完了とスワップの違いになります。

データ サイエンティストのタスクに numpy を使用するための実践的な習慣: 重要なインデックス作成操作の後、arr.base is None をチェックしてメモリを所有しているかどうかを確認し、arr.flags['C_CONTIGUOUS'] をチェックしてレイアウトが下流の C または Fortran ルーチンが期待するものであるかどうかを確認します。ここでは、内部メモリ レイアウトに関する NumPy 自身のドキュメントが信頼できるリファレンスとなります。

関連: — ガイド付きターミナルと実際のデータセットを使用したプロジェクトベースのデータ サイエンス パス.

データ サイエンスにおける NumPy の使用: 実際にその地位を獲得する場所

データ サイエンティストの numpy ワークフローの場合、NumPy の用途は 5 つの繰り返しジョブに使用します。

大規模な数値前処理。 特徴の標準化、対数変換カウント、外れ値のクリップ、ペアごとの距離の計算はすべて要素ごとの演算またはリダクション演算です。これらを ndarray で実行すると、行ごとの Python のオーバーヘッドが回避されます。

線形代数。 最小二乗法、SVD による PCA、共分散推定、および密行列系の解法は、MATLAB および R が使用するのと同じ BLAS/LAPACK ライブラリを呼び出す numpy.linalg を介してルーティングされます。適切に調整された OpenBLAS または MKL ビルドは、同じマシン上の単純なビルドよりも数倍高速になる可能性があります。

一見の価値があります: — 大学が支援する Python およびデータサイエンス証明書の 1 つのサブスクリプション.

ランダム シミュレーション。 numpy.random.default_rng() (NumPy 1.17 で導入されたジェネレーター API) は、従来の RandomState よりも再現可能で、統計的により適切に動作するストリームを提供します。モンテカルロ作業、ブートストラップ リサンプリング、置換検定はすべてここにあります。

バイナリ形式とのインターフェイス。 HDF5、NetCDF、Zarr、およびメモリ マップされた RAW ファイルはすべて、配列のようなインターフェイスを公開します。 np.memmap を使用すると、ディスクからページングすることで RAM より大きい配列を操作できます。

ライブラリ間の接着。 pandas、PyTorch、xarray 間の変換は通常、NumPy を経由します。バッファ プロトコルは、これらの変換が多くの場合ゼロコピーであることを意味します。

NumPy はデータ サイエンスにとって重要ですか?正直な答え

NumPy がデータ サイエンティストにとって重要なのは、NumPy が依存関係にあるためであり、常に書き込み対象となるインターフェイスであるためではありません。現役のデータ サイエンティストは、「import numpy as np」を直接入力せずに何ヶ月も過ごすことができますが、すべての pandas 操作、すべての scikit-learn フィット、すべての matplotlib プロットがその下で NumPy コードを実行しています。

重要なのは構造的なものです。 NumPy は、エコシステムの残りの部分が同意する配列 API を定義します。この仕様は現在 Python Array API 標準として形式化されており、CuPy、JAX、PyTorch などのライブラリが互換性のあるインターフェイスを公開できるようになります。したがって、NumPy の学習は、関数を覚えるというよりは、後で使用するすべての配列ライブラリに転送されるメンタル モデルを学習することに重点が置かれます。

NumPy が答え「ではない」場合: 文字列を多用する ETL、異種テーブル間の結合、不規則なタイムスタンプによる時系列リサンプリング、メモリに収まらないデータセットに対する遅延評価を必要とするもの。そのような場合は、pandas、Polars、DuckDB、または Dask を使用してください。

関連: — 科学技術コンピューティング関連の書籍、ビデオ、ライブ トレーニングの詳細な技術ライブラリ.

ベクトル化、ブロードキャスト、および危険なルール

ブロードキャストでは右から形状を比較します。 2 つの次元が等しいか、一方が 1 の場合、それらの次元は互換性があります。サイズ 1 の寸法はコピーせずに引き伸ばされます。 (1000, 3) 特徴行列から (3,) 平均ベクトルを引いたものが機能します。 (1000, 3) 行列から (1000,) ベクトルを引いたものは、後続の次元 3 と 1000 が一致しないため、エラーになります。修正は、ほとんどの場合、ループではなく mean[:, None] です。これは、データ サイエンティストのワークフローにとって numpy の重要な概念です。

実際のコードでは 3 つの障害モードが繰り返し発生します。

  1. 偶発的な外積。 2 つの 100k 要素ベクトル上の a[:, None] * b[None, :] は、10^10 の浮動小数点を割り当てます。これは float64 で 80 GB です。チャンク化するか、すぐに即座にリダクションを行う定式化を使用してください。
  2. 整数オーバーフロー np.int32 算術演算はサイレントにラップされます。 int32 での大きなカウントの合計は、負の合計が発生する典型的な原因です。
  3. ビューに対するインプレース操作 arr[::2] += 1 は親バッファを変更します。多くの場合、これが望ましいことですが、場合によっては、キャッシュされた配列を破損するバグが発生することもあります。

適切なツールの選択: NumPy と代替ツール

タスク最良の第一選択なぜ
ラベル付きの表形式データ、結合、groupbypandas または Polarsインデックスのアライメントと欠損値のセマンティクス
密な数値配列、線形代数NumPy直接 BLAS/LAPACK アクセス、最小限のオーバーヘッド
RAM より大きい配列Dask、Zarr、または np.memmapチャンクまたはページ実行
GPU で高速化された配列計算CuPy または JAXNumPy 互換 API、デバイス実行
疎行列SciPy sparseメモリは非ゼロでスケールします。
研究コードのための Autodiff と JITJAX配列プログラム上の関数変換

決定ルール: データに意味のある行ラベルがあり、列の型が混在している場合は、パンダから始めます。それが同種の数値ブロックであり、スループットを重視する場合は、データ サイエンティストにとって重要な numpy ツールである NumPy から始めてください。メモリに収まらない場合は、チャンク化されたフレームワークから開始して、各チャンク内の NumPy にドロップします。

ショッピングの場合: — ブラウザーで直接コーディングするインタラクティブな Python およびデータ サイエンス コース.

実際に針を動かすパフォーマンス向上のための実践

dtype を問題に合わせます。 float32 はメモリを半分にし、FP32:FP64 比 2:1 のハードウェアでのスループットを 2 倍にしますが、10 進数で約 7 桁の精度が犠牲になります。反復ソルバーや長時間のシミュレーションでは、その誤差が蓄積されます。表示指向の前処理の場合は、通常はこれで問題ありません。

事前割り当てと完了。 ループ内で np.append を使用して配列を展開すると、各反復が再割り当てされます。出力を一度割り当てて、それをチャンクに分けて割り当てます。

一時的なものを避けるには out= を使用します。 np.multiply(a, b, out=c) は既存のメモリに書き込みます。大規模な配列上のタイトなループでは、これにより割り当てのプレッシャーがなくなり、キャッシュの動作が改善されます。

実体化よりも実体化よりもリダクションを優先します。 np.einsum と np.dot は、中間配列を構築せずに短縮を表現します。 (a[:, None] * b[None, :]).sum(axis=1) と a * b.sum() は、大きく異なるメモリ プロファイルで同じことを計算します。

NumPy を終了するタイミングを知ってください。 分岐のある要素ごとの関数の場合、Numba または Cython は一時配列を完全に回避するため、ベクトル化された NumPy に勝つことができます。行に対する Python レベルのループがあるものについては、NumPy ではなくループが問題になります。

NumPy 2.x: 何が変わったのか、そしてなぜそれが重要なのか

2024 年 6 月にリリースされた NumPy 2.0 は、2006 年以来初のメジャー バージョンアップです。3 つの変更が、データ サイエンティスト コミュニティの numpy の作業コードに影響を与えます。 Windows のデフォルトの整数型は、Linux および macOS に合わせて「int32」から「int64」に移動しました。 NEP 50 では型の昇格が強化され、Python スカラーが驚くべき方法で配列をアップキャストすることがなくなりました。「np.float32(1) + 1.0」は float32 のままになりました。また、C API が再編成されたため、バイナリ互換性が失われ、1.x に対してコンパイルされた拡張機能は再構築する必要がありました。

ほとんどの分析コードでは移行は問題なく行われますが、暗黙的なアップキャストに依存した数値コードでは最後のビットで結果が変わる可能性があります。実稼働環境をアップグレードする前にテスト スイートを 2.x に対して実行し、再現可能な研究成果物にバージョンを固定します。 NumPy リリース ノートには、すべての変更が文書化されています。

研究グループ向けの再現性に関するメモ

データ サイエンティストにとって numpy による再現可能な数値作業は、シード以上のものに依存します。 NumPy のバージョン、BLAS 実装 (OpenBLAS、MKL、および Accelerate は、同じ操作に対して異なる最終ビットの結果を返します)、スレッド数、およびパブリッシュされた Figure をフィードするすべての配列の dtype を記録します。 np.show_config() はビルドの詳細を出力します。

浮動小数点の合計は結合的ではないため、並列リダクションは実行ごとに異なる可能性があります。結果がビット同一である必要がある場合は、単一スレッドでペアごとの合計を含む np.sum を使用するか、明示的に Kahan 合計を使用します。共有ラボ パイプラインの場合は、NumPy をロックファイルに固定し、そのロックファイルをデータと一緒に保存します。

出典と詳細情報

  • データ サイエンス — Wikipedia: データ サイエンスは、統計、科学計算、科学的方法、処理、科学的視覚化、アルゴリズムなどを使用する学際的な学術分野です。

よくある質問

NumPy はデータ サイエンスで何に使用されますか?

NumPy は、ほとんどの科学的な Python ライブラリが構築される N 次元配列とベクトル化された操作を提供します。データ サイエンティストは、数値前処理、線形代数、ランダム シミュレーションなどのデータ サイエンティスト タスクに numpy を使用し、パンダ、scikit-learn、PyTorch、プロット ライブラリ間の交換形式として numpy を使用します。カスタム パイプラインでは直接使用が一般的です。間接的な使用は普遍的です。

主にパンダを使用する場合、NumPy はデータ サイエンスにとって重要ですか?

はい、パンダは数値列を NumPy 配列として保存し、その計算を NumPy に委任するためです。 dtype、ビューとコピー、ブロードキャストを理解すると、パンダのパフォーマンスとメモリの動作のほとんどが説明されます。 NumPy を直接書かなくても生産性は高くなりますが、その下の層を理解していればデバッグが速くなります。

NumPy と pandas を最初に学ぶべきですか?

作業にシミュレーション、信号、画像、またはカスタム数値アルゴリズムが含まれる場合は、まず NumPy を学習してください。ラベル付き列と混合型を使用した表形式分析を行う場合は、まず pandas を学習してください。実際には、数時間の NumPy (配列、インデックス付け、ブロードキャスト、リダクション) を実行すると、パンダの謎はすぐに薄れます。

NumPy は純粋な Python ループと比較してどれくらい速いですか?

ベクトル化された NumPy 操作は通常、同じデータに対する同等の Python ループよりも 1 ~ 2 桁高速に実行されます。これは、内部ループが要素ごとのインタープリターのオーバーヘッドなしでコンパイルされた C で実行されるためです。演算をベクトル化できない場合、配列が十分に小さいため呼び出しオーバーヘッドが優勢な場合、またはベクトル化された形式で大きな一時変数が割り当てられる場合、ギャップは狭くなるか逆転します。

NumPy は欠損データを処理しますか?

NumPy には浮動小数点数用の「np.nan」とマスクされた配列「np.ma」がありますが、どちらも dtype 間での pandas スタイルの欠損値セマンティクスを提供しません。 NumPy 1.24 以降、「np.nan」は浮動小数点型と複素数型に対してのみ有効であり、整数配列はそれを保持できません。実際の欠損データの処理には、pandas の null 許容 dtype または専用のフレームワークを使用します。

コードを壊す可能性のある NumPy 2.0 の変更点は何ですか?

NumPy 2.0 は、Windows のデフォルトの整数を int64 に変更し、NEP 50 プロモーション ルールを採用して Python スカラーが配列をアップキャストしないようにし、C API を再編成して、1.x に対して構築された拡張機能とのバイナリ互換性がなくなりました。ほとんどの分析コードは変更せずに実行されますが、dtype プロモーションの影響を受ける数値コードは再テストする必要があります。

よくある質問

NumPy はデータ サイエンスで何に使用されますか?

NumPy は、ほとんどの科学的な Python ライブラリが構築される N 次元配列とベクトル化された操作を提供します。データ サイエンティストは、数値前処理、線形代数、ランダム シミュレーションなどのデータ サイエンティスト タスクに numpy を使用し、パンダ、scikit-learn、PyTorch、プロット ライブラリ間の交換形式として numpy を使用します。カスタム パイプラインでは直接使用が一般的です。間接的な使用は普遍的です。

主にパンダを使用する場合、NumPy はデータ サイエンスにとって重要ですか?

はい、パンダは数値列を NumPy 配列として保存し、その計算を NumPy に委任するためです。 dtype、ビューとコピー、ブロードキャストを理解すると、パンダのパフォーマンスとメモリの動作のほとんどが説明されます。 NumPy を直接書かなくても生産性は高くなりますが、その下の層を理解していればデバッグが速くなります。

NumPy と pandas を最初に学ぶべきでしょうか?

作業にシミュレーション、信号、画像、またはカスタム数値アルゴリズムが含まれる場合は、まず NumPy を学習してください。ラベル付き列と混合型を使用した表形式分析を行う場合は、まず pandas を学習してください。実際には、数時間の NumPy (配列、インデックス付け、ブロードキャスト、リダクション) を実行すると、パンダの謎はすぐに薄れます。

NumPy は純粋な Python ループと比較してどれくらい高速ですか?

ベクトル化された NumPy 操作は通常、同じデータに対する同等の Python ループよりも 1 ~ 2 桁高速に実行されます。これは、内部ループが要素ごとのインタープリターのオーバーヘッドなしでコンパイルされた C で実行されるためです。演算をベクトル化できない場合、配列が十分に小さいため呼び出しオーバーヘッドが優勢な場合、またはベクトル化された形式で大きな一時変数が割り当てられる場合、ギャップは狭くなるか逆転します。

NumPy は欠損データを処理しますか?

NumPy には、float 用の np.nan とマスクされた配列 np.ma がありますが、どちらも dtype 間での pandas スタイルの欠損値セマンティクスを提供しません。 NumPy 1.24 以降、np.nan は浮動小数点型と複素数型に対してのみ有効であり、整数配列はそれを保持できません。実際の欠損データの処理には、pandas の null 許容 dtype または専用のフレームワークを使用します。

コードを壊す可能性のある NumPy 2.0 の変更点は何ですか?

NumPy 2.0 は、Windows のデフォルトの整数を int64 に変更し、NEP 50 プロモーション ルールを採用して Python スカラーがアップキャスト配列を行わないようにし、C API を再編成して、1.x に対して構築された拡張機能とのバイナリ互換性を破壊しました。ほとんどの分析コードは変更せずに実行されますが、dtype プロモーションの影響を受ける数値コードは再テストする必要があります。


ブラウザでコーディングして Python を学習する

ブラウザーで直接コーディングするインタラクティブな Python およびデータ サイエンス コース