Menu
CoddyTech

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.nannp.NaN
無限大np.infnp.Inf
64ビット浮動小数点型np.float64np.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 チートシートは完全無料で、登録も不要です。ブックマークするか、ブラウザから PDF に印刷しておけば、reshape、axis ごとの合計、乱数の生成などの正確な書き方が必要なときにいつでも見返せます。
このチートシートはどの NumPy バージョンに対応していますか?
NumPy 2 です。すべてのコードは Coddy で動いている NumPy 2.4 で動作します。NumPy 2 では np.NaN、np.float_、np.trapz、np.in1d などのエイリアスが削除されたため、最後の表でそれぞれを現在の名前と並べています。
NumPy の axis=0 とはどういう意味ですか?
axis は集約されて消える次元のことです。2次元配列では 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 配列を使う理由は?
配列は1つの型を1つのメモリブロックに格納するので、配列全体の演算はコンパイル済みのコードで実行され、Python のループより何倍も速いことがよくあります。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 も動きますが、レガシーなインターフェースです。
NumPy のコードをオンラインで実行できますか?
はい。無料の Matplotlib プレイグラウンド では、NumPy、pandas、Matplotlib、scikit-learn 入りの Python をブラウザで実行できるので、このチートシートのどのコードも貼り付けてすぐ試せます。インストールは不要です。Coddy の機械学習コースでは、実データを扱いながら NumPy を一歩ずつ学べます。
Coddyのプログラミング言語のイラスト

CoddyでNumPyを学ぼう

始める