NumPyとは何ですか
NumPyは、Pythonにおける科学計算の基本パッケージです。多次元配列オブジェクト、様々な派生オブジェクト(マスク配列や行列など)、そして配列に対する高速演算のための様々なルーチン(数学演算、論理演算、形状操作、ソート、選択、入出力、離散フーリエ変換、基本的な線形代数、基本的な統計演算、ランダムシミュレーションなど)を提供するPythonライブラリです。
NumPyパッケージの中核を成すのは、オブジェクトですndarray。これは、同種のデータ型のn次元配列をカプセル化し、パフォーマンス向上のため多くの操作がコンパイル済みコードで実行されます。NumPy配列と標準のPythonシーケンスには、いくつかの重要な違いがあります。
-
NumPy配列は、Pythonリスト(動的にサイズが変化する)とは異なり、作成時にサイズが固定されます。配列のサイズを変更すると、
ndarray新しい配列が作成され、元の配列は削除されます。 -
NumPy配列の要素はすべて同じデータ型である必要があり、したがってメモリ上でのサイズも同じになります。ただし、例外として、(NumPyを含む)Pythonオブジェクトの配列は使用可能であり、これにより異なるサイズの要素を持つ配列を作成できます。
-
NumPy配列は、大量のデータに対して高度な数学演算やその他の演算を容易に実行できます。通常、このような演算は、Pythonの組み込みシーケンスを使用する場合よりも効率的に、かつ少ないコードで実行できます。
-
科学計算や数学計算を行うPythonベースのパッケージはますます増えており、その多くがNumPy配列を使用しています。これらのパッケージは通常、Pythonシーケンスの入力をサポートしていますが、処理前にNumPy配列に変換し、多くの場合、出力もNumPy配列で行います。つまり、今日の科学計算や数学計算を行うPythonベースのソフトウェアの多く(おそらくほとんど)を効率的に使用するには、Pythonの組み込みシーケンス型の使い方を知っているだけでは不十分で、NumPy配列の使い方も知っておく必要があります。
シーケンスのサイズと速度に関する点は、科学計算において特に重要です。簡単な例として、1次元シーケンスの各要素を、同じ長さの別のシーケンスの対応する要素と乗算する場合を考えてみましょう。データが2つのPythonリストとに格納されている場合、a各b要素を次のように反復処理できます。
c = []
for i in range(len(a)):
c.append(a[i]*b[i])
これは正しい答えを生成しますが、aとbそれぞれに数百万の数値が含まれている場合、Pythonのループ処理の非効率性の代償を支払うことになります。C言語では、次のように記述することで同じタスクをはるかに高速に実行できます(分かりやすさのために、変数宣言と初期化、メモリ割り当てなどは省略します)。
for (i = 0; i < rows; i++) {
c[i] = a[i]*b[i];
}
これにより、Python コードの解釈や Python オブジェクトの操作に伴うオーバーヘッドはすべて削減されますが、Python でコーディングすることによって得られるメリットは失われます。さらに、必要なコーディング作業はデータの次元数に応じて増加します。たとえば、2 次元配列の場合、C コード (前述のように省略) は次のように展開されます。
for (i = 0; i < rows; i++) {
for (j = 0; j < columns; j++) {
c[i][j] = a[i][j]*b[i][j];
}
}
NumPy は両方の利点を兼ね備えています。要素ごとの操作は、要素がndarray関係する場合の「デフォルト モード」ですが、要素ごとの操作はプリコンパイルされた C コードによって高速に実行されます。NumPy では
c = a * b
以前の例と同じことを、C言語に近い速度で実行しますが、Pythonベースのものならではのコードの簡潔さを実現しています。実際、NumPyのイディオムはさらにシンプルです。この最後の例は、NumPyの強力な機能の多くを支える2つの機能、ベクトル化とブロードキャストを示しています。
NumPyが速いのはなぜですか
ベクトル化とは、コード内に明示的なループやインデックス付けなどが一切存在しない状態を指します。もちろん、これらの処理は最適化され、事前にコンパイルされたCコードの中で「舞台裏」で行われています。ベクトル化されたコードには多くの利点があり、その中には以下のようなものがあります。
-
ベクトル化されたコードはより簡潔で読みやすい。
-
一般的に、コード行数が少ないほどバグも少なくなる。
-
このコードは標準的な数学表記法により近い形式になっているため(一般的に、数学的な構造を正しく記述することが容易になる)、
-
ベクトル化によって、より「Pythonらしい」コードが生まれます。ベクトル化を行わないと、コードは非効率的で読みにくい
forループだらけになってしまうでしょう。
ブロードキャストとは、演算の暗黙的な要素ごとの動作を表す用語です。一般的に、NumPy では、算術演算だけでなく、論理演算、ビット演算、関数演算など、すべての演算がこの暗黙的な要素ごとの動作、つまりブロードキャストを行います。さらに、上記の例では、aと はb同じ形状の多次元配列、スカラーと配列、あるいは形状の異なる 2 つの配列であっても構いません。ただし、小さい方の配列が、結果として得られるブロードキャストが曖昧にならないように、大きい方の配列の形状に「拡張可能」である必要があります。ブロードキャストの詳細な「ルール」については、「 ブロードキャスト」を参照してください。
他にNumPyを使っている人はいますか?
NumPy は、再び から始まるオブジェクト指向アプローチを完全にサポートしていますndarray。たとえば、 は、ndarray多数のメソッドと属性を持つクラスです。そのメソッドの多くは、最も外側の NumPy 名前空間の関数によってミラーリングされているため、プログラマは好みのパラダイムでコーディングできます。この柔軟性により、NumPy 配列方言と NumPyクラスは、Python で使用される多次元データ交換の事実上のndarray言語となっています。

コメント
最新を表示する
NG表示方式
NGID一覧