NumPyは「ナンパイ」または「ナムパイ」と読みます。Numerical Pythonを縮めた名前で、Pythonで数値計算と配列処理を高速に行うための定番ライブラリです。読みについてはNumPyの公式サイトにも公式リポジトリにも定めが無く、根拠として示せるのは英語版Wikipediaの発音表記 /ˈnʌmpaɪ/(NUM-py)です。
この記事では、読み方の根拠とSciPy・linalgなど周辺語の読み方を整理したうえで、インストール、ndarrayの基本操作、速さの実測、NumPy 2.xで古いコードが動かなくなる原因までを扱います。掲載コードと実測値は2026年10月時点の最新版NumPy 2.5.4(Python 3.12.13)で実行して確かめました。
まとめ
- 読み方は「ナンパイ」または「ナムパイ」。英語版Wikipediaの表記は /ˈnʌmpaɪ/(NUM-py)で、NumPy公式は読みを定めていない
- NumPyはNumerical Pythonの略。中心は同じ型の要素を並べた多次元配列
ndarray - インストールは
pip install numpy。最新の2.5系はPython 3.12以上が必要で、Python 3.11以下では古い版が入る - 1,000万要素の2倍計算はリスト内包表記の約30倍速く、メモリは約5分の1(2.5.4で実測)。ただし10要素程度の配列や、要素を1つずつ触るforループではリストより遅い
- 古いコードの
np.float_やnp.NaNは2.0で削除済み。2.5ではnp.row_stackも削除され、shapeへの代入が非推奨になった
NumPyの読み方と名前の由来
読みは「ナンパイ」「ナムパイ」、英語の発音はNUM-py
日本語では「ナンパイ」と「ナムパイ」のどちらも使われ、同じライブラリを指します。英語版WikipediaのNumPyの項目は冒頭で発音を /ˈnʌmpaɪ/、つづり読みで「NUM-py」と示しています。先頭の「num」に強勢があり、末尾の「py」はPythonの「パイ」と同じ音です。「m」の後に「p」が続くので、日本語で続けて言うと「ナンパイ」に近く聞こえます。
名前はNumerical Python(数値計算用のPython)の「Num」と「Py」をつないだものです。
公式資料での扱い:NumPyは定めず、SciPyは「Sigh Pie」と明記
NumPyの公式サイトとソースコードのリポジトリ(GitHubの numpy/numpy と numpy/numpy.org)を2026年10月22日にコード検索で「pronounce」から当たったところ、読みを定めた記述はありませんでした。資料ごとの扱いは次のとおりです。
| 資料 | 読みの扱い |
|---|---|
| NumPy公式サイト・リポジトリ | 記述なし |
| 英語版Wikipedia | /ˈnʌmpaɪ/(NUM-py) |
| 日本語版Wikipedia | 本文に読みを載せていない |
| SciPy公式README | SciPyは「Sigh Pie」と明記 |
| scikit-learn公式FAQ | scikit-learnは「sy-kit learn」と明記 |
| PyPI公式ヘルプ | PyPIは「pie pea eye」と明記 |
日本語版Wikipediaの記事は、原稿の中で「ナムパイまたはナンパイ」という読みを独自研究(出典の無い記述)として非表示にしており、出典付きの日本語の読みは載っていません。
同じ「Py」で終わる姉妹ライブラリのSciPyは、公式READMEの1文目で「SciPy (pronounced “Sigh Pie”)」と読みを明記しています。末尾の「Py」を「パイ」と読む慣習は、ここからも裏付けられます。逆に、パッケージ配布サイトのPyPIは公式ヘルプで「pie pea eye」(パイ・ピー・アイ)と読むよう求めており、「PI」は1文字ずつ読みます。SciPyの読み方と使い方の詳細はSciPyとは?読み方・使い方・NumPyとの違いをPythonで解説にまとめています。
NumPyと周辺ライブラリ・用語の読み方一覧
NumPyを使い始めると、関数名や周辺ライブラリにも読みに迷う語が出てきます。公式に読みが定められているのはSciPy・scikit-learn(公式FAQ)・PyPIで、ほかは元の英単語から来る一般的な読みです。
| 表記 | 読み方 | 元の語・意味 |
|---|---|---|
| NumPy | ナンパイ/ナムパイ | Numerical Python |
| ndarray | エヌディーアレイ | N-dimensional array |
| np | エヌピー | NumPyの慣習的な別名 |
| dtype | ディータイプ | data type(要素の型) |
| linalg | リナルグ/リニアアルジェブラ | linear algebra(線形代数) |
| SciPy | サイパイ | 公式表記「Sigh Pie」 |
| pandas | パンダス | 表形式データの分析 |
| Matplotlib | マットプロットリブ | グラフ描画 |
| scikit-learn | サイキット・ラーン | 公式FAQ「sy-kit learn」 |
| PyPI | パイ・ピー・アイ | 公式表記「pie pea eye」 |
linalg は np.linalg.inv(逆行列)や np.linalg.det(行列式)のように線形代数の関数をまとめたモジュール名です。読みの定めは無いため、会話では「リナルグ」と略すか、元の「リニアアルジェブラ」と言えば通じます。なお、検索で見かける「numpty」はNumPyとは別の英単語で、Cambridge Dictionaryの語釈は「a stupid or silly person」(まぬけな人)です。
NumPyとは:Pythonの数値計算を支える配列ライブラリ
NumPyは、多次元配列オブジェクト ndarray と、それを高速に処理する関数群を提供するオープンソースのライブラリです。公式ドキュメントのWhat is NumPy?は、Pythonのリストとの違いを4点挙げており、そのうち配列の構造に関わるのは次の2点です。
- 配列の大きさは作成時に固定される。大きさを変えると新しい配列が作られ、元の配列は破棄される
- 要素はすべて同じデータ型でなければならない
この制約と引き換えに、配列全体への演算をコンパイル済みのCコードで一括処理できます。統計、線形代数、フーリエ変換、乱数生成もそろっており、pandas・SciPy・scikit-learn・Matplotlibなど主要なライブラリがNumPyの配列を土台にデータを受け渡しています。
前身は1995年ごろにJim Huguninらが作ったNumericです。大きな配列が得意な後継のNumarrayと並立した時期を経て、2005年にTravis OliphantがNumarrayの機能をNumericへ取り込み、2006年にNumPy 1.0として公開しました。2024年6月16日に約18年ぶりのメジャー版となる2.0.0が出て、2026年10月時点の最新は2.5.4(2026年10月10日公開・UTC)です。ライセンスはBSD-3-Clause(同梱コードの一部はMIT・Zlibなど)で、商用でも無償で使えます。
NumPyのインストール手順とバージョン確認
pip・uv・condaでのインストール
NumPyはPythonの標準ライブラリに含まれないため、別途インストールします。Windows・macOS・Linuxのいずれも、ターミナル(Windowsはコマンドプロンプト)で次の1行です。
pip install numpy
uvでプロジェクトを管理している場合は uv add numpy、Anaconda・Miniforgeの環境では conda install numpy を使います。pipとcondaを同じ環境で混ぜると依存関係が壊れることがあるので、どちらか一方に寄せてください。使い分けはpipとcondaの違いと使い分けで詳しく扱っています。Jupyter Notebookで試す場合の導入手順はJupyter Notebookのインストール手順を参照してください。
Pythonの版で入るNumPyの版が変わる
pip install numpy で入る版は、手元のPythonの版で決まります。NumPy 2.5.0はPython 3.11のサポートを打ち切り、2.5.0のリリースノートは対応範囲を「Python versions 3.12-3.14」としています。各Pythonの版でuvに依存関係を解決させた結果(2026年10月22日)は次のとおりです。
| Python | 入るNumPy | NumPy側の要件 |
|---|---|---|
| 3.12〜3.14 | 2.5.4 | 3.12以上 |
| 3.11 | 2.4.6 | 3.11以上 |
| 3.10 | 2.2.6 | 3.10以上 |
| 3.9 | 2.0.2 | 3.9以上 |
macOSでXcode Command Line Toolsに含まれる /usr/bin/python3 はPython 3.9系なので、そのまま python3 -m pip install numpy すると2.0.2が入ります。2.5系の機能(後述の降順ソートなど)を使うなら、Python 3.12以上の仮想環境を作ってから入れてください。インストール時にエラーが出る場合も、まずPythonの版がこの表に合っているかを確かめるのが近道です。
import numpy as np の意味とバージョン確認
NumPyは import numpy as np と書いて読み込みます。as np は「numpyを np という短い名前で使う」という指定です。公式の入門ガイドはこれを「widespread convention」(広く使われている慣習)と呼び、短く見分けやすい接頭辞 np. でNumPyの関数を、同名の他の関数と区別できると説明しています。
import numpy as np
print(np.__version__) # 2.5.4
a = np.array([1, 2, 3])
print(a + 1) # [2 3 4]
print(np.sum(a)) # 6
版番号が表示されればインストールは成功です。ターミナルからは python -c "import numpy; print(numpy.__version__)" や pip show numpy でも確認できます。
ndarrayの基本操作:作成・形状・インデックス・軸
配列の作成:array・zeros・arange・linspace
リストから作る np.array のほか、0や1で埋める関数、連番を作る関数をよく使います。
import numpy as np
a = np.array([1, 2, 3]) # リストから作成
z = np.zeros((2, 3)) # 0で埋めた2行3列
o = np.ones(3) # [1. 1. 1.]
e = np.eye(3) # 3行3列の単位行列
r = np.arange(5) # [0 1 2 3 4]
l = np.linspace(0, 1, 5) # [0. 0.25 0.5 0.75 1. ]
形状とデータ型の確認・変形
shape で形、dtype で要素の型を確認し、reshape で形を変えます。NumPy 2.0からWindowsでも既定の整数型がint64になり、OSによって dtype が変わる問題は解消されました(2.0.0のリリースノート)。
b = np.array([[1, 2, 3], [4, 5, 6]])
print(b.shape) # (2, 3)
print(b.dtype) # int64
m = np.arange(6).reshape(2, 3)
print(m.T.shape) # (3, 2) 転置
print(m.flatten()) # [0 1 2 3 4 5]
スライスと条件による抽出
arr[1:4] のように範囲で取り出せるほか、arr > 25 のような比較式を角括弧に入れると、条件に合う要素だけを抜き出せます(ブールインデックス)。
arr = np.array([10, 20, 30, 40, 50])
print(arr[1:4]) # [20 30 40]
print(arr[arr > 25]) # [30 40 50] 条件に合う要素だけ取り出す
軸(axis)を指定した集計
2次元配列では axis=0 が縦方向(列ごと)、axis=1 が横方向(行ごと)の集計です。初学者がつまずきやすい点なので、結果の形で覚えてください。
b = np.array([[1, 2, 3], [4, 5, 6]])
print(np.sum(b)) # 21
print(np.sum(b, axis=0)) # [5 7 9] 列ごとの合計
print(np.sum(b, axis=1)) # [ 6 15] 行ごとの合計
print(np.mean(b, axis=0)) # [2.5 3.5 4.5]
NumPyが速い理由と実測:リストとの速度・メモリ比較
速さの仕組み:コンパイル済みCコードとベクトル化
公式ドキュメントは、NumPyが速い理由をベクトル化(vectorization)で説明しています。コードにforループや添字が現れず、繰り返しは「最適化されたコンパイル済みのCコード」の中で行われる、という意味です。c = a * b と書くだけで要素ごとの掛け算がCに近い速度で走ります。形の違う配列どうしを自動で揃えて計算する仕組みはブロードキャストと呼ばれます。
x = np.array([1, 2, 3])
y = np.array([[10], [20], [30]])
print(x + y)
# [[11 12 13]
# [21 22 23]
# [31 32 33]]
NumPy 2.5.4での実測値
Python 3.12.13+NumPy 2.5.4(Intel Core i9-9880H搭載のMac)で、timeit による5回計測の中央値を取りました。メモリは tracemalloc で測った確保量です。
| 処理(1,000万要素) | リスト | NumPy | 差 |
|---|---|---|---|
| 全要素を2倍 | 1.78〜1.86秒 | 50〜64ミリ秒 | 約29〜36倍 |
| 合計 | 252ミリ秒 | 8.2〜8.7ミリ秒 | 約29〜31倍 |
| 確保メモリ | 381.5MiB | 76.3MiB | 約5分の1 |
リストは各要素を整数オブジェクト(本体28バイト、確保量は1要素あたり約32バイト)として持ち、それを指す8バイトのポインタの配列を別に抱えます。ndarray はint64の値を8バイトずつ連続した領域に並べるだけなので、1,000万要素でちょうど80,000,000バイトに収まります。計測に使ったコードのうち、2倍計算の部分は次のとおりです。
import timeit
import numpy as np
n = 10_000_000
lst = list(range(n))
arr = np.arange(n)
t_list = sorted(timeit.repeat("[x * 2 for x in lst]", globals=globals(), repeat=5, number=1))[2]
t_np = sorted(timeit.repeat("arr * 2", globals=globals(), repeat=5, number=1))[2]
print(f"list {t_list:.3f}s numpy {t_np:.3f}s")
5回の計測値を並べ替えた3番目、つまり中央値を出します。数値はCPUや同時に動いている処理の負荷で変わるので、自分の環境で一度測っておくと判断がぶれません。
NumPyが遅くなる場面:小さい配列と要素ごとのループ
NumPyを使えば必ず速くなるわけではありません。同じ環境での実測では、次の2つの場面でリストに負けました。
- 10要素の配列を2倍する:リスト内包表記が1回あたり約0.9マイクロ秒、NumPyが約2.6〜2.8マイクロ秒。関数呼び出しと配列の生成にかかる固定費が、計算そのものより大きくなる
- forループで要素を1つずつ書き換える:100万要素で、
ndarrayは666〜686ミリ秒、リストは192〜199ミリ秒。a[i]で取り出すたびにNumPyのスカラーオブジェクトが作られるため、リストより3倍以上遅い
数十要素程度の値を扱うだけならリストで十分です。NumPyを入れたのにforループで1要素ずつ処理しているコードは、配列全体の演算に書き換えるのが先です。どうしてもループが避けられない処理は、Cythonなどでループ自体をコンパイルする方法があります(Cythonとは?使い方・インストールと型宣言の効果を実測)。
よく使うNumPy関数一覧
最初に押さえたい関数を分類別にまとめます。
| 分類 | 主な関数 |
|---|---|
| 配列の作成 | array zeros ones eye arange linspace |
| 形状の操作 | reshape flatten transpose concatenate vstack |
| 統計 | mean median std var sum |
| 線形代数 | dot linalg.inv linalg.det linalg.eigh |
| 並べ替え | sort argsort unique |
| 乱数 | random.default_rng |
| 入出力 | save load savetxt loadtxt |
data = np.array([1, 2, 3, 4, 5])
print(np.mean(data)) # 3.0
print(np.median(data)) # 3.0
print(np.std(data)) # 1.4142135623730951
mat = np.array([[1, 2], [3, 4]])
print(np.dot(mat, mat)) # 行列積 [[ 7 10] [15 22]]
print(np.linalg.det(mat)) # -2.0000000000000004(浮動小数点の誤差を含む)
rng = np.random.default_rng(seed=0)
print(rng.integers(0, 10, 5)) # [8 6 5 2 3]
乱数は、公式の入門ガイドが「the simplest way to generate random numbers」と案内する np.random.default_rng() で作ります。シードを渡すと同じ乱数列を再現できます。
NumPy 2.xで古いコードが動かない原因と直し方
削除された別名とエラー文
NumPy 1.x向けに書かれた記事や社内コードを2.x系で動かすと、別名の削除で AttributeError が出ます。2.5.4で実行したときのエラー文には、置き換え先が書かれています。
>>> np.float_
AttributeError: `np.float_` was removed in the NumPy 2.0 release. Use `np.float64` instead.
| 古い書き方 | 置き換え先 | 削除された版 |
|---|---|---|
np.float_ |
np.float64 |
2.0 |
np.NaN |
np.nan |
2.0 |
np.Inf np.infty |
np.inf |
2.0 |
np.round_ |
np.round |
2.0 |
np.alltrue |
np.all |
2.0 |
np.string_ |
np.bytes_ |
2.0 |
np.in1d np.trapz |
np.isin np.trapezoid |
2.4 |
np.row_stack |
np.vstack |
2.5 |
2.0の行はエラー文の「removed in the NumPy 2.0 release」によるもので、2.4・2.5の行は2.3.5・2.4.6・2.5.4を入れて属性の有無を確かめた結果です(np.row_stack の削除は2.5.0のリリースノートにも記載があります)。2.5で消えた np.row_stack のように、2.0で動いたコードがその後のマイナー版で落ちることもあります。古いコードを移すときは、まず python -W error::DeprecationWarning で非推奨の警告をエラーにして洗い出してください。
型の昇格ルールの変更(NEP 50)
2.0では、異なる型どうしを計算したときの結果の型の決め方が変わりました(NEP 50)。値の大きさを見て型を広げる挙動がなくなり、NumPy側の型が優先されます。NEP 50の対照表にある例を2.5.4で実行した結果です。
| 式 | 1.x | 2.5.4 |
|---|---|---|
np.uint8(1) + 300 |
int64(301) |
OverflowError |
np.uint8(100) + 200 |
int64(300) |
uint8(44)と警告 |
np.array([1.], np.float32) + np.float64(1.) |
float32の配列 | float64の配列 |
uint8の配列に範囲内の定数を足して255を超えたときに黙って桁あふれするのは、1.xでも同じです(NumPy 1.26.4でも np.array([100], np.uint8) + 200 は [44])。2.xで変わったのは、300のようにuint8で表せない定数を足したとき、uint16への自動昇格ではなく OverflowError になる点です。画像データのように範囲を超えうる計算は、img.astype(np.int16) のように先に型を広げてから行ってください。
NumPy 2.5の変更点:対応Pythonと新機能
2.5系は2026年6月21日の2.5.0から、2.5.1(7月4日)、2.5.2(8月9日)、2.5.3(9月6日)、2.5.4(10月10日)と更新が続いています(PyPIの公開履歴。日付はUTC)。リリースノートは2.5.0を「transitional release」(移行のための版)と位置付けています。Python 3.11と numpy.distutils のサポートを打ち切り、2.0系で非推奨にしたAPIの多くを削除しました。
- 対応Python:3.12〜3.14。3.11は対象外
- 降順ソート:
np.sort(a, descending=True)とnp.argsortで降順に並べられる。NaNは末尾に回る。2.4.6で同じ引数を渡すとTypeError - 固有値の戻り値:
linalg.eigとlinalg.eigvalsは常に複素数の配列を返す。対称行列なら実数を返すeigheigvalshを使う - 新しい非推奨:
arr.shape = (2, 3)のような形状の代入(reshapeへ)、dtypeの代入(arr.view(dtype=...)へ)、np.fix(np.truncへ)がDeprecationWarningを出す - free-threading:GILを外したPython(3.14t など)への対応を改善
a = np.array([3, 1, 2, np.nan])
print(np.sort(a, descending=True)) # [ 3. 2. 1. nan]
w = np.linalg.eigvals(np.array([[2.0, 0.0], [0.0, 3.0]]))
print(w) # [2.+0.j 3.+0.j] 2.4.6では [2. 3.]
固有値を実数前提で比較していたコードは、2.5で複素数が返って結果が変わります。共分散行列のような対称行列は、最初から eigh に切り替えておくのが確実です。GILを外したPythonの全体像はPython 3.14のJITコンパイラとフリースレッド版で扱っています。
NumPyとpandas・SciPy・scikit-learnの役割分担
実務では、NumPyを単体で使うより、上に載るライブラリと組み合わせる場面がほとんどです。役割はNumPyが配列と数値計算の土台、ほかがその上の専門処理と分かれています。
- pandas:行と列にラベルを付けた表形式データ。CSVの読み込みや集計はこちら。
df.to_numpy()でNumPy配列に戻せる - SciPy:最適化・積分・信号処理・統計検定など、NumPyの配列を受け取る専門的な計算
- scikit-learn:機械学習。学習データはNumPy配列(またはpandasのDataFrame)で渡す
- Matplotlib:NumPy配列をそのまま渡してグラフを描く
表のデータをラベル付きで扱うならpandas、数値の配列をまとめて計算するならNumPy、と分けると迷いません。NumPyやpandasを組み込んだ分析処理を業務システムとして作り込む場合は、フルスクラッチ開発で要件から設計できます。
よくある質問
NumPyの読み方は?
「ナンパイ」または「ナムパイ」です。NumPy公式は読みを定めておらず、英語版Wikipediaは /ˈnʌmpaɪ/(NUM-py)と表記しています。
NumPyは何の略ですか?
Numerical Python(数値計算用のPython)の略です。「Num」と「Py」を組み合わせた名前です。
NumPyとpandasの違いは何ですか?
NumPyは同じ型の数値を並べた多次元配列を高速に計算するライブラリで、pandasはその上に行と列のラベルを付けた表形式データを扱うライブラリです。CSVの読み込みや列名での集計はpandas、行列計算や大量の数値の一括演算はNumPyが担います。
import numpy as np はどういう意味ですか?
numpyを読み込み、np という短い名前で使えるようにする書き方です。公式の入門ガイドも広く使われている慣習として紹介しており、以降は np.array のように呼び出します。
NumPyの最新バージョンは?
2026年10月時点の最新は2.5.4(2026年10月10日公開・UTC)で、Python 3.12〜3.14に対応しています。Python 3.11では2.4.6が上限です。最新の版はPyPIのnumpyのページで確認できます。
NumPyのインストールでエラーが出たときは?
まずPythonの版を確かめてください。2.5系はPython 3.12以上が必要で、それより古いPythonでは古いNumPyが入るか、指定した版が見つからないエラーになります。仮想環境が有効になっているか、pipとcondaを混ぜていないかも確認します。