1.1 定義と目的

NumPy(Numerical Python)は、Pythonプログラミング言語向けの基本的な数値計算ライブラリです。その中心的な目的は、大規模な多次元配列効率的に扱い、高速な数値演算を提供することにあります。NumPyは低レベルのC言語実装により、Pythonの標準的なリスト操作よりもはるかに高速な計算処理を実現します。科学技術計算、データ分析機械学習の基盤として、多くの高レベルライブラリの依存元となっています。

1.2 歴史と開発背景

NumPyの起源は、1995年にJim Huguninが開発したNumericライブラリにさかのぼります。その後、2001年にTravis OliphantがNumericとNumarrayという2つの競合ライブラリを統合し、NumPyプロジェクトを立ち上げました。2005年に初版がリリースされ、以降、Pythonの科学計算エコシステムの基盤として徐々に標準化されました。NumPyはオープンソースコミュニティによって活発に開発され、現在ではPythonの科学技術計算における事実上の標準ライブラリとなっています。

2.1 ndarray(多次元配列)

2.1.1 配列の作成と基本操作

ndarray(N-dimensional array)はNumPyの中心的なデータ構造であり、同じデータ型の要素を持つ多次元のグリッドです。配列はnumpy.array()関数やnumpy.zeros()numpy.ones()numpy.arange()などの便利な関数を使用して作成できます。基本操作には、スライシング、インデックス参照、形状変更(reshape)、転置(transpose)などがあり、これらはすべて高速に実行されます。

2.1.2 ブロードキャスト

ブロードキャストは、異なる形状の配列間で算術演算を実行するための強力な機能です。NumPyは自動的に配列の形状を拡張し、要素ごとの演算を可能にします。例えば、形状が(3, 1)の配列と(1, 4)の配列の加算は、自動的に(3, 4)の結果を生成します。これにより、ループを使用せずに効率的なベクトル演算が実現します。

2.2 ユニバーサル関数(ufunc)

2.2.1 算術演算と数学関数

ユニバーサル関数(ufunc)は、配列の各要素に対して高速に演算を適用する関数です。基本算術演算(加算、減算、乗算、除算)はすべてufuncとして実装されており、np.addnp.subtractなどの形で呼び出せます。三角関数np.sinnp.cos)、指数関数np.exp)、対数関数np.log)など、多くの数学関数もufuncとして提供されています。

2.2.2 集約関数

集約関数は、配列全体の統計量を計算するために使用されます。np.sum(合計)、np.mean平均)、np.std標準偏差)、np.min(最小値)、np.max最大値)などが代表的です。これらの関数は軸(axis)パラメータを指定することで、特定の次元に沿った集約計算も可能です。

2.3 線形代数モジュール

2.3.1 行列積と分解

numpy.linalgモジュールは、線形代数演算のための包括的な関数を提供します。np.dot@演算子による行列積、np.linalg.choleskyによるコレスキー分解、np.linalg.svdによる特異値分解、np.linalg.qrによるQR分解などが利用可能です。

2.3.2 連立方程式固有値

連立一次方程式の解法にはnp.linalg.solveを使用し、行列の逆行列の計算にはnp.linalg.invを使用します。固有値と固有ベクトルの計算にはnp.linalg.eig(一般行列用)やnp.linalg.eigh対称行列用)が用意されています。これらの機能は、科学技術計算やデータ解析において頻繁に利用されます。

2.4 乱数生成

2.4.1 乱数配列の生成

numpy.randomモジュールは、さまざまな乱数生成機能を提供します。np.random.rand(一様分布[0,1))、np.random.randn(標準正規分布)、np.random.randint(整数乱数)などを使用して、指定した形状の乱数配列を生成できます。NumPy 1.17以降では、新しい乱数ジェネレータ(default_rng)の使用が推奨されています。

2.4.2 確率分布サンプリング

NumPyは多くの確率分布からのサンプリングをサポートしています。np.random.binomial二項分布)、np.random.poissonポアソン分布)、np.random.exponential指数分布)、np.random.normal(正規分布)など、主要な分布が網羅されています。これらの機能は、統計的シミュレーションや機械学習のデータ拡張に広く利用されます。

3.1 組み込みデータ型

NumPyは数多くの組み込みデータ型を提供し、メモリ効率の良い数値計算を可能にします。主な型には、整数型(int8int16int32int64)、符号なし整数型(uint8uint16uint32uint64)、浮動小数点型(float16float32float64)、複素数型(complex64complex128)、ブール型(bool)などがあります。適切なデータ型を選択することで、計算速度とメモリ使用量を最適化できます。

3.2 メモリレイアウトとストライド

NumPy配列のメモリレイアウトは、ストライド(strides)と呼ばれる属性によって管理されます。ストライドは、各次元における隣接する要素間のメモリオフセット(バイト数)を示すタプルです。配列は行優先(C言語形式)または列優先(Fortran形式)でメモリ上に格納され、np.ascontiguousarraynp.asfortranarrayを使用して変換できます。この設計により、高速なスライシングや転置操作が可能になっています。

4.1 NumPyバイナリ形式(.npy, .npz)

NumPyは独自のバイナリファイル形式をサポートしています。.npyファイルは単一の配列を保存し、.npzファイルは複数の配列を圧縮してもしくは非圧縮で保存できます。保存にはnp.savenp.savez、読み込みにはnp.loadを使用します。これらの形式は、データ型や形状などのメタ情報も保持するため、可搬性が高く、科学計算におけるデータ永続化に広く利用されています。

4.2 テキストファイルの読み書き

数値データをCSVやタブ区切りなどのテキスト形式で扱うための関数も提供されています。np.loadtxtnp.genfromtxtはテキストファイルの読み込みに、np.savetxtは書き出しに使用されます。これらの関数は、欠損値の処理、ヘッダーのスキップ、区切り文字の指定など、柔軟なオプションを備えており、外部データの取り込みに便利です。

5.1 SciPy・Matplotlibとの関係

NumPyは、Pythonの科学技術計算エコシステムの基盤として機能します。SciPy(Scientific Python)はNumPy配列をデータ構造として使用し、より高度な最適化、積分、補間、信号処理などの機能を提供します。MatplotlibはNumPy配列を直接扱い、高品質なグラフや可視化を生成します。これらの3つのライブラリは密接に連携し、「SciPyスタック」と呼ばれる強力な環境を形成しています。

5.2 機械学習ライブラリ(TensorFlow, PyTorch)との互換性

現代の機械学習フレームワークは、NumPy配列との高い互換性を持っています。TensorFlowとPyTorchは、NumPy配列を対応するテンソルオブジェクトに変換する機能(tf.convert_to_tensortorch.from_numpy)を提供し、GPU上での計算が可能です。逆に、テンソルからNumPy配列への変換(.numpy()メソッド)もサポートされており、CPU上での後処理や可視化に活用できます。

6.1 ベクトル化とループ回避

NumPyの最大の強みは、ベクトル化演算による高速処理にあります。明示的なPythonループ(for文)を避け、配列全体に対する一括演算(ベクトル化)を使用することで、C言語で実装された内部ループの恩恵を受けられます。例えば、for i in range(n): y[i] = a * x[i] + y[i] の代わりに y = a * x + y と記述することで、数十倍から数百倍の高速化が期待できます。

6.2 並列処理とGPUサポート(CuPy)

NumPy自体は主にCPU上でのシングルスレッド処理ですが、拡張ライブラリにより並列処理が可能です。CuPyはNumPyのAPIを持つ互換ライブラリで、NVIDIA GPU上での計算を支援します。コードの大部分を変更せずにGPUアクセラレーションを実現できます。また、numbaライブラリを使用すると、JITコンパイルによりNumPyコードを自動的に高速化することも可能です。

7.1 開発コミュニティ

NumPyは、GitHub上でホストされるオープンソースプロジェクトとして、世界中の開発者コミュニティによって開発・保守されています。プロジェクトはNumPy Steering Councilによって管理され、定期的なリリースサイクルが維持されています。ユーザーはGitHubのIssueやPull Requestを通じてバグ報告や機能提案ができ、公式のメーリングリストやDiscordチャンネルでも活発な議論が行われています。

7.2 ライセンス(BSD 3-Clause)

NumPyはBSD 3-Clauseライセンスの下で配布されています。このライセンスは寛容なオープンソースライセンスであり、商用利用、改変、再配布が自由に許可されています。主な条件は、著作権表示と免責事項を保持すること、およびライセンス文書を配布物に含めることです。この寛容なライセンスにより、NumPyは学術研究から商用製品まで、幅広い用途で利用されています。