NumPy
NumPyは、プログラミング言語Pythonにおいて数値計算を効率的に行うための拡張モジュールである。効率的な数値計算を行うための型付きの多次元配列(例えばベクトルや行列などを表現できる)のサポートをPythonに加えるとともに、それらを操作するための大規模な高水準の数学関数ライブラリを提供する。
作者 | Travis Oliphant |
---|---|
開発元 | コミュニティ開発 |
初版 | 1995年 |
最新版 | 2.1.3[1] - 2024年11月2日 [±] |
リポジトリ | |
プログラミング 言語 | Python |
対応OS | クロスプラットフォーム |
種別 | 数値計算 |
ライセンス | 修正BSDライセンス |
公式サイト |
numpy |
沿革
編集NumPyの祖先であるNumericはジム・ハグニンらによって開発された。その後2005年にトラヴィス・オリファントが、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に対して型付きの多次元配列オブジェクト (numpy.ndarray
) と、その配列に対する多数の演算関数や操作関数を提供することにより、この問題を解決しようとしている。NumPyの内部はC言語 (およびFortran)によって実装されているため非常に高速に動作する。したがって、目的の処理を、大きな多次元配列(ベクトル・行列など)に対する演算として記述できれば(ベクトル化できれば)、計算時間の大半はPythonではなくC言語によるネイティブコードで実行されるようになり大幅に高速化する。さらに、NumPyは BLAS APIを実装した行列演算ライブラリ (OpenBLAS, ATLAS, Intel Math Kernel Library など)を使用して線形代数演算を行うため、C言語で単純に書いた線形代数演算よりも高速に動作しうる[2](速度が落ちるが BLAS ライブラリを使用しないコンパイルも可能)。
一般に、行列演算においてはメモリ帯域がボトルネックになる事が多い。NumPyのAPIの構造上、特に複数の演算が連なる場合に、余計なメモリの読み書きが多発する。その問題を解決し、不要なメモリの読み書きを減少させるために、NumPyを利用して動作するNumexprが開発されている[3]。
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()
不規則配列
編集多次元配列(テンソル)のうち、要素が異なる長さを持つものを不規則配列(英: ragged array)という[4][5]。NumPyは固定のshapeをもつ多次元配列を高い効率で計算することに特化したライブラリであり、不規則配列を基本的にサポートしていない[6]。明示的にobject
型の配列を作成することで不規則配列を操作することは可能である(自動推論は非推奨化された[7])が、あくまでポインタ配列であり、メモリレイアウト等のNumPy機能はサポートされない。
脚注
編集- ^ "Release 2.1.3"; 閲覧日: 2024年11月9日; 出版日: 2024年11月2日.
- ^ “SciPy PerformancePython”. 2009年9月28日閲覧。
- ^ pydata/numexpr - GitHub
- ^ "they sometimes err in matching the lengths of the nested sequences, commonly called 'ragged arrays'." NEP 34 — Disallow inferring
dtype=object
from sequences. NumPy. - ^ "Ragged tensors are the TensorFlow equivalent of nested variable-length lists." Ragged tensors. TensorFlow Core.
- ^ "NumPy doesn’t support ragged arrays" Special types. h5py.
- ^ "will force users who actually wish to create
object
arrays to specify that explicitly." NEP 34 — Disallow inferringdtype=object
from sequences. NumPy.
関連項目
編集- 数値解析ソフトウェア
- SciPy - NumPyを基盤にした科学計算ライブラリ
- matplotlib - NumPyを基盤にしたグラフ描画ライブラリ
- Pandas - データの操作や解析のためのライブラリ
- Sage - 幅広い分野を網羅する数学ソフトウェア
- JAX – GPU および TPU 上での NumPy プログラムの自動微分が可能なライブラリ[1]
脚注
編集- ^ “JAX: Autograd and XLA”. 2020年11月19日閲覧。
学習用参考書など
編集- 吉田拓真、尾原颯:「現場で使える!NumPyデータ処理入門 第2版:機械学習・データサイエンスで役立つ高速処理手法」、翔泳社、ISBN:978-4-79818642-9 (2024年8月26日)。