NumPy チートシート
最終更新
配列を作る
配列は1つの型の値を、任意の次元数のグリッドに格納します。
| やりたいこと | コード |
|---|---|
| NumPy をインポート | import numpy as np |
| リストから作成 | np.array([1, 2, 3]) |
| ネストしたリストから2次元配列 | np.array([[1, 2, 3], [4, 5, 6]]) |
| ゼロ、1、任意の値で埋める | np.zeros((2, 3)), np.ones(4), np.full((2, 2), 7) |
| ステップ付きの範囲 (終端を含まない) | np.arange(0, 10, 2) # [0 2 4 6 8] |
| 等間隔の n 点 (終端を含む) | np.linspace(0, 1, 5) # [0. 0.25 0.5 0.75 1.] |
| 単位行列 | np.eye(3) |
| 別の配列と同じ形状 | np.zeros_like(m), np.ones_like(m) |
| 要素の型を指定 | np.array([1, 2, 3], dtype=np.float32) |
| 座標グリッド | xx, yy = np.meshgrid(np.arange(3), np.arange(2)) |
配列を確認する
| やりたいこと | コード |
|---|---|
| 形状 (各次元のサイズ) | m.shape # (3, 4) |
| 次元数 | m.ndim # 2 |
| 要素数 | m.size # 12 |
| 要素の型 | m.dtype # int64 |
| 型を変換 | m.astype(np.float64) |
| 最初の次元の長さ | len(m) # 3 |
| Python のリストに戻す | m.tolist() |
| 表示する小数の桁数を減らす | np.set_printoptions(precision=3, suppress=True) |
インデックスとスライス
スライスはビューで、元の配列とメモリを共有します。マスクやインデックスのリストはコピーを返します。
| やりたいこと | コード |
|---|---|
| 最初と最後の要素 | a[0], a[-1] |
| start:stop のスライス (stop を含まない) | a[1:4] # [20 30 40] |
| 1つおきの要素、逆順 | a[::2], a[::-1] |
| 2次元配列の1要素 | m[1, 2] # 6 |
| 1行、1列 | m[0], m[:, 1] |
| 行と列のブロック | m[:2, 1:3] |
| 条件に合う要素 | a[a > 25] # [30 40 50] |
| 条件を組み合わせる | a[(a > 15) & (a < 45)] |
| 位置のリストで取り出す | a[[0, 2, 4]] |
| 条件に合う位置 | np.flatnonzero(a > 25) # [2 3 4] |
| 要素ごとに値を選ぶ | np.where(a > 25, a, 0) |
| スライスを変更する前にコピー | part = a[1:3].copy() |
| マスクで値を設定 | a[a > 40] = 0 |
演算とブロードキャスト
演算子は要素ごとに作用します。ブロードキャストは、スカラー、行、列をもう一方の配列の形状に合わせて引き伸ばします。
| やりたいこと | コード |
|---|---|
| 要素ごとの四則演算 | x + y, x - y, x * y, x / y, x ** 2 |
| スカラーとの演算 | x * 10 |
| 平方根、指数、対数 | np.sqrt(x), np.exp(x), np.log(x) |
| 絶対値、丸め | np.abs(x - 5), np.round(x / 3, 2) |
| 値を範囲内に収める | np.clip(x, 2, 8) |
| 要素ごとの最大値 | np.maximum(x, 3) |
| 内積 | x @ y # 37.0 |
| 各列を中心化 (行をブロードキャスト) | m - m.mean(axis=0) |
| 各行をスケーリング (列をブロードキャスト) | m / m.sum(axis=1, keepdims=True) |
| 浮動小数点数を安全に比較 | np.isclose(0.1 + 0.2, 0.3) # True, np.allclose(x, y) |
| 三角関数と円周率 | np.sin(np.pi / 2) # 1.0 |
axis に沿って集計する
axis=0 は行方向に処理して列ごとに1つの結果を返します。axis=1 は列方向に処理して行ごとに1つの結果を返します。
| やりたいこと | コード |
|---|---|
| 全要素の合計 | m.sum() # 21 |
| 列ごとに1つの結果 | m.sum(axis=0) # [5 7 9] |
| 行ごとに1つの結果 | m.sum(axis=1) # [ 6 15] |
| 平均と標準偏差 | m.mean(), m.std(), m.mean(axis=0) |
| 最小値、最大値 | m.min(), m.max(axis=1) |
| 最大値の位置 | m.argmax(), m.argmax(axis=1) |
| 中央値とパーセンタイル | np.median(m), np.percentile(m, [25, 50, 75]) |
| 累積合計 | np.cumsum(m, axis=1) |
| 全要素の積 | m.prod() # 720 |
| いずれか、すべて、件数 | (m > 4).any(), (m > 0).all(), np.count_nonzero(m > 2) |
形状変更と結合
reshape は要素をそのままに形状だけを変えるので、全体のサイズは同じでなければなりません。
| やりたいこと | コード |
|---|---|
| 新しい形状 | a.reshape(2, 3) |
| 1つのサイズを NumPy に計算させる | a.reshape(3, -1), a.reshape(-1, 1) |
| 1次元に平坦化 | m.ravel(), m.flatten() |
| 転置 | m.T |
| 次元を追加 | a[:, np.newaxis], np.expand_dims(a, axis=0) |
| サイズ1の次元を削除 | np.squeeze(np.ones((1, 3, 1))) |
| 既存の軸に沿って連結 | np.concatenate([a, a]) |
| 行または列を積み重ねる | np.vstack([m, m]), np.hstack([m, m]) |
| 1次元配列を列として並べる | np.column_stack([a, a ** 2]) |
| 新しい軸に沿って積み重ねる | np.stack([a, a], axis=0) # shape (2, 6) |
| 分割する | np.split(a, 3), np.array_split(a, 4) |
| 繰り返し、タイル状に並べる | np.repeat([1, 2], 2) # [1 1 2 2], np.tile([1, 2], 2) # [1 2 1 2] |
ソート、検索、ユニークな値
| やりたいこと | コード |
|---|---|
| ソートしたコピー | np.sort(a) |
| 大きい順 | np.sort(a)[::-1] |
| ソート順のインデックス | np.argsort(a) |
| 上位3つの値 | np.sort(a)[-3:] |
| ユニークな値とその件数 | values, counts = np.unique(a, return_counts=True) |
NumPy 2 の名前 (unique_values はソートされないことも) | np.unique_values(a), np.unique_counts(a) |
| 各要素がリストに含まれるか | np.isin(a, [1, 9]) |
| ソート済み配列への挿入位置 | np.searchsorted([1, 3, 5, 7], 4) # 2 |
| 集合演算 | np.intersect1d(a, [1, 2, 10]), np.union1d(a, [10]), np.setdiff1d(a, [1]) |
| 1つの列で行をソート | m[m[:, 1].argsort()] |
乱数
シードを指定した Generator を1つ作り、すべてそこから生成しましょう。何度実行しても同じ結果になります。
| やりたいこと | コード |
|---|---|
| シード付きのジェネレータ | rng = np.random.default_rng(42) |
| [0, 1) の浮動小数点数 | rng.random(3) |
| 整数 (上限を含まない) | rng.integers(1, 7, size=10) |
| 正規分布 | rng.normal(loc=0, scale=1, size=(2, 3)) |
| 範囲内の一様な浮動小数点数 | rng.uniform(5, 10, size=4) |
| リストから選ぶ | rng.choice(["a", "b", "c"], size=5) |
| 重複なしで選ぶ | rng.choice(10, size=3, replace=False) |
| 重み付きで選ぶ | rng.choice(["H", "T"], size=10, p=[0.7, 0.3]) |
| シャッフルしたコピー、その場でシャッフル | rng.permutation(a), rng.shuffle(a) |
| 二項分布とポアソン分布の件数 | rng.binomial(10, 0.5, size=5), rng.poisson(3, size=5) |
線形代数
| やりたいこと | コード |
|---|---|
| 行列の積 | A @ A |
| Ax = b を解く | np.linalg.solve(A, b) # [0.8 1.4] |
| 逆行列と行列式 | np.linalg.inv(A), np.linalg.det(A) |
| ベクトルの長さ | np.linalg.norm(b) |
| 固有値と固有ベクトル | values, vectors = np.linalg.eig(A) |
| 直線をフィット | slope, intercept = np.polyfit(x, y, 1) |
| 外積 | np.outer([1, 2], [3, 4]) |
| 対角成分とトレース | np.diag(A), np.trace(A) |
欠損値と特殊な値
np.nan は浮動小数点数の欠損を表します。これを含む演算はすべて nan になるので、nan 系の関数かマスクを使いましょう。
| やりたいこと | コード |
|---|---|
| 欠損値 | np.nan |
| 欠損値を見つける | np.isnan(v), np.isnan(v).sum() |
| 欠損値を除く | v[~np.isnan(v)] |
| 欠損値と無限大を置き換え | np.nan_to_num(v, nan=0.0, posinf=0.0) |
| 無限大と有限値の判定 | np.inf, np.isfinite(v) |
| NaN を無視する統計関数 | np.nanmean(v[:3]) # 2.0, np.nanmax(v) |
保存と読み込み
| やりたいこと | コード |
|---|---|
| 1つの配列をバイナリファイルに | np.save("data.npy", m), m = np.load("data.npy") |
| 複数の配列を1つのファイルに | np.savez("data.npz", x=x, y=y), np.load("data.npz")["x"] |
| CSV テキストに書き出す | np.savetxt("data.csv", m, delimiter=",", fmt="%d") |
| CSV テキストを読み込む | np.loadtxt("data.csv", delimiter=",") |
NumPy 2: 旧名称と今の書き方
NumPy 2 では多くのエイリアスが削除されたため、古いチュートリアルからコピーしたコードは AttributeError で失敗することがあります。
| やりたいこと | NumPy 2 | 旧書式 |
|---|---|---|
| 欠損値 | np.nan | np.NaN |
| 無限大 | np.inf | np.Inf |
| 64ビット浮動小数点型 | np.float64 | np.float_ |
| 曲線の下の面積 | np.trapezoid(y, x) | np.trapz(y, x) |
| 各要素が別の配列に含まれるか | np.isin(a, b) | np.in1d(a, b) |
| 行を積み重ねる | np.vstack([a, a]) | np.row_stack([a, a]) |
| 積 | np.prod(a) | np.product(a) |
| 乱数 | rng = np.random.default_rng(0)
rng.random(3) | np.random.seed(0)
np.random.rand(3) |
データサイエンスのコードの土台になる NumPy の呼び出しを、タスク別にまとめました。配列の作成と確認、インデックスとスライス、要素ごとの演算、axis に沿った集計、形状変更と結合、ソートと検索、乱数の生成、線形代数まで揃っています。各行は貼り付けてすぐ使える短いコードと、その動作を説明する一文で構成されています。
すべて Coddy で動いている NumPy 2 向けに書いており、最後の表には NumPy 2 で削除された名前と今の書き方を並べています。ほとんどの例では a = np.array([3, 1, 4, 1, 5, 9, 2, 6]) と m = np.arange(12).reshape(3, 4) を使います。Python 自体が初めての方は Python チートシート と Python プレイグラウンド から始めて、pandas、Matplotlib、scikit-learn のチートシートもあわせて手元に置いておきましょう。
NumPy チートシートのよくある質問
この NumPy チートシートは無料ですか?
このチートシートはどの NumPy バージョンに対応していますか?
np.NaN、np.float_、np.trapz、np.in1d などのエイリアスが削除されたため、最後の表でそれぞれを現在の名前と並べています。NumPy の axis=0 とはどういう意味ですか?
axis=0 は行方向に処理するので、m.sum(axis=0) は列ごとに1つの合計を返します。axis=1 は列方向に処理し、行ごとに1つの合計を返します。axis を指定しなければ、関数はすべての要素を使います。ビューとコピーの違いは何ですか?
a[1:3] のようなスライスはビューで、a とメモリを共有するため、スライスを変更すると a も変わります。a[a > 2] や a[[0, 2]] のようなブールマスクやインデックスのリストはコピーを返します。独立した配列が必要なときは .copy() を呼びましょう。Python のリストではなく NumPy 配列を使う理由は?
a * 2 はすべての要素を2倍にしますが、[1, 2] * 2 はリストを繰り返します。pandas も scikit-learn も NumPy 配列の上に作られています。np.random.seed と default_rng のどちらを使うべきですか?
rng = np.random.default_rng(seed) を使い、rng.normal() や rng.integers() のように rng のメソッドを呼びましょう。こちらが推奨 API で、乱数ストリームの質が高く、隠れたグローバル状態もありません。np.random.seed と np.random.rand も動きますが、レガシーなインターフェースです。