NumPy

プログラミング言語Pythonにおいて数値計算を効率的に行うための拡張モジュール

NumPyは、プログラミング言語Pythonにおいて数値計算を効率的に行うための拡張モジュールである。効率的な数値計算を行うための型付きの多次元配列(例えばベクトルや行列などを表現できる)のサポートをPythonに加えるとともに、それらを操作するための大規模な高水準数学関数ライブラリを提供する。

NumPy
作者 Travis Oliphant
開発元 コミュニティ開発
初版 1995年 (1995)
最新版 2.1.3[1] ウィキデータを編集 - 2024年11月2日 (49日前) [±]
リポジトリ ウィキデータを編集
プログラミング
言語
Python
対応OS クロスプラットフォーム
種別 数値計算
ライセンス 修正BSDライセンス
公式サイト numpy.org ウィキデータを編集
テンプレートを表示

沿革

編集

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機能はサポートされない。

脚注

編集
  1. ^ "Release 2.1.3"; 閲覧日: 2024年11月9日; 出版日: 2024年11月2日.
  2. ^ SciPy PerformancePython”. 2009年9月28日閲覧。
  3. ^ pydata/numexpr - GitHub
  4. ^ "they sometimes err in matching the lengths of the nested sequences, commonly called 'ragged arrays'." NEP 34 — Disallow inferring dtype=object from sequences. NumPy.
  5. ^ "Ragged tensors are the TensorFlow equivalent of nested variable-length lists." Ragged tensors. TensorFlow Core.
  6. ^ "NumPy doesn’t support ragged arrays" Special types. h5py.
  7. ^ "will force users who actually wish to create object arrays to specify that explicitly." NEP 34 — Disallow inferring dtype=object from sequences. NumPy.

関連項目

編集

脚注

編集
  1. ^ JAX: Autograd and XLA”. 2020年11月19日閲覧。

学習用参考書など

編集
  • 吉田拓真、尾原颯:「現場で使える!NumPyデータ処理入門 第2版:機械学習・データサイエンスで役立つ高速処理手法」、翔泳社、ISBN:978-4-79818642-9 (2024年8月26日)。

外部リンク

編集