NumPy

NumPyは、プログラミング言語Pythonにおいて数値計算を効率的に行うための拡張モジュールである。効率的な数値計算を行うための型付きの多次元配列（例えばベクトルや行列などを表現できる）のサポートをPythonに加えるとともに、それらを操作するための大規模な高水準の数学関数ライブラリを提供する。
沿革.
NumPyの祖先であるNumericはJum Huguninらによって開発された。その後2005年にTravis Oliphantが、Numarrayの機能をNumericに組み込み、そこへ大幅な修正を加えることで、NumPyを開発した。NumPyはオープンソースソフトウェアであり、多数の開発者が寄与している。
NumPyは、Python 2.4から2.7 および Python 3.1以降で使用できる。2011年には、PyPy用NumPy APIの開発も開始された。またNumPyをCythonで記述し高速化を図っている。
目的.
Pythonは動的型付け言語であるため、プログラムを柔軟に記述できる一方で、純粋にPythonのみを使って数値計算を行うと、ほとんどの場合C言語やJavaなどの静的型付き言語で書いたコードに比べて大幅に計算時間がかかる。そこでNumPyは、Pythonに対して型付きの多次元配列オブジェクト (codice_1) と、その配列に対する多数の演算関数や操作関数を提供することにより、この問題を解決しようとしている。NumPyの内部はC言語 (およびFortran)によって実装されているため非常に高速に動作する。したがって、目的の処理を、大きな多次元配列（ベクトル・行列など）に対する演算として記述できれば（ベクトル化できれば）、計算時間の大半はPythonではなくC言語によるネイティブコードで実行されるようになり大幅に高速化する。さらに、NumPyは BLAS APIを実装した行列演算ライブラリ (OpenBLAS, ATLAS, Intel Math Kernel Library など)を使用して線形代数演算を行うため、C言語で単純に書いた線形代数演算よりも高速に動作しうる（速度が落ちるが BLAS ライブラリを使用しないコンパイルも可能）。
一般に、行列演算においてはメモリ帯域がボトルネックになる事が多い。NumPyのAPIの構造上、特に複数の演算が連なる場合に、余計なメモリの読み書きが多発する。その問題を解決し、不要なメモリの読み書きを減少させるために、NumPyを利用して動作するNumexprが開発されている。
MATLAB との比較.
PythonとNumPyの組み合わせはMATLABに近い機能性を提供するため、NumPyをMATLABのフリーな代替物として使用する者もいる。いずれも動的プログラミング言語としての高い柔軟性を持ち、配列や行列を用いた高速な演算を行うことができる。両者の比較としては、MATLABはプロプライエタリ製品であり高価だが、組み込みの数学関数を多数備え、さらに様々な用途のための実用的なパッケージやSimulinkのようなツールボックスが提供されている。その一方で、NumPyは、MATLABよりも汎用的かつ現代的なプログラミング言語であるPythonに統合されており、なおかつPythonはオープンソースかつフリーである。NumPyには各種の補助的なライブラリが存在し、例えば、SciPyは、さらにMATLAB的な科学計算関数をNumPyに追加するライブラリであり、MatplotlibはMATLABライクなグラフ描画機能を提供するパッケージである。NumPyとMATLABの両者はともに、LAPACK APIを経由して、行列演算ライブラリによる演算を行なっている。
例.
以下の例では、NumPyとmatplotlibを用いて、Pythonの対話環境における非常に単純なベクトル操作とプロットを実演している。
»> import numpy
»> from matplotlib import pyplot
»> x = numpy.linspace(0, 2 * numpy.pi, 100)
»> y = numpy.sin(x)
»> pyplot.plot(x, y)
»> pyplot.show()
不規則配列.
多次元配列（テンソル）のうち、要素が異なる長さを持つものを不規則配列（）という。NumPyは固定のshapeをもつ多次元配列を高い効率で計算することに特化したライブラリであり、不規則配列を基本的にサポートしていない。明示的にcodice_2型の配列を作成することで不規則配列を操作することは可能である（自動推論は非推奨化された）が、あくまでポインタ配列であり、メモリレイアウト等のNumPy機能はサポートされない。