NumPy チートシート
Learn NumPy with Hands-On Labs
LabEx では、ハンズオンラボと現実世界のシナリオを通じて NumPy 数値計算を学習できます。LabEx は、必須の配列操作、数学関数、線形代数、パフォーマンス最適化を網羅した包括的な NumPy コースを提供しています。データサイエンスのワークフローのために、効率的な数値計算と配列操作を習得しましょう。
配列の作成と初期化
リストから:np.array()
Python のリストまたはネストされたリストから配列を作成します。
import numpy as np
# リストからの 1D 配列
arr = np.array([1, 2, 3, 4])
# ネストされたリストからの 2D 配列
arr2d = np.array([[1, 2], [3, 4]])
# データ型を指定
arr = np.array([1, 2, 3], dtype=float)
# 文字列の配列
arr_str = np.array(['a', 'b', 'c'])
ログインしてこのクイズに回答し、学習の進捗を追跡できます
ゼロとイチ:np.zeros() / np.ones()
ゼロまたはイチで埋められた配列を作成します。
# ゼロの配列
zeros = np.zeros(5) # 1D
zeros2d = np.zeros((3, 4)) # 2D
# イチの配列
ones = np.ones((2, 3))
# データ型を指定
zeros_int = np.zeros(5, dtype=int)
単位行列:np.eye() / np.identity()
線形代数演算のための単位行列を作成します。
# 3x3 の単位行列
identity = np.eye(3)
# 代替メソッド
identity2 = np.identity(4)
範囲配列:np.arange() / np.linspace()
等間隔の値を持つ配列を作成します。
# Python の range に似ている
arr = np.arange(10) # 0 から 9 まで
arr = np.arange(2, 10, 2) # 2, 4, 6, 8
# 等間隔の値
arr = np.linspace(0, 1, 5) # 0 から 1 までの 5 つの値
# 終点を含む
arr = np.linspace(0, 10, 11)
ランダム配列:np.random
ランダムな値を持つ配列を生成します。
# 0 から 1 の間のランダムな値
rand = np.random.random((2, 3))
# ランダムな整数
rand_int = np.random.randint(0, 10, size=(3, 3))
# 正規分布
normal = np.random.normal(0, 1, size=5)
# 再現性のためのランダムシード設定
np.random.seed(42)
特殊な配列:np.full() / np.empty()
特定の値で埋める配列、または未初期化の配列を作成します。
# 特定の値で埋める
full_arr = np.full((2, 3), 7)
# 空の配列(未初期化)
empty_arr = np.empty((2, 2))
# 既存の配列の形状に合わせる
like_arr = np.zeros_like(arr)
配列のプロパティと構造
基本プロパティ:shape / size / ndim
配列の次元とサイズに関する基本的な情報を取得します。
# 配列の次元 (タプル)
arr.shape
# 要素の総数
arr.size
# 次元数
arr.ndim
# 要素のデータ型
arr.dtype
# 各要素のバイトサイズ
arr.itemsize
配列情報:メモリ使用量
配列のメモリ使用量と構造に関する詳細情報を取得します。
# メモリ使用量 (バイト単位)
arr.nbytes
# 配列情報 (デバッグ用)
arr.flags
# 配列がデータを所有しているか確認
arr.owndata
# ベースオブジェクト (配列がビューの場合)
arr.base
データ型:astype()
異なるデータ型間で効率的に変換します。
# 異なる型への変換
arr.astype(float)
arr.astype(int)
arr.astype(str)
# より具体的な型
arr.astype(np.float32)
arr.astype(np.int16)
配列のインデックス指定とスライス
基本インデックス指定:arr[index]
個々の要素とスライスにアクセスします。
# 単一要素
arr[0] # 最初の要素
arr[-1] # 最後の要素
# 2D 配列のインデックス指定
arr2d[0, 1] # 0 行目、1 列目
arr2d[1] # 1 行目全体
# スライス
arr[1:4] # 1 番目から 3 番目の要素まで
arr[::2] # 2 つおきの要素
arr[::-1] # 配列を反転
ブールインデックス指定:arr[condition]
条件に基づいて配列をフィルタリングします。
# 単純な条件
arr[arr > 5]
# 複数の条件
arr[(arr > 2) & (arr < 8)]
arr[(arr < 2) | (arr > 8)]
# ブール配列
mask = arr > 3
filtered = arr[mask]
ログインしてこのクイズに回答し、学習の進捗を追跡できます
arr[arr > 5] は何を返しますか?高度なインデックス指定:Fancy Indexing
インデックスの配列を使用して複数の要素にアクセスします。
# インデックス配列によるインデックス指定
indices = [0, 2, 4]
arr[indices]
# 2D ファンシーインデックス指定
arr2d[[0, 1], [1, 2]] # 要素 (0,1) と (1,2)
# スライスとの組み合わせ
arr2d[1:, [0, 2]]
Where 関数:np.where()
条件付きの選択と要素の置換を行います。
# 条件が真であるインデックスを見つける
indices = np.where(arr > 5)
# 条件付き置換
result = np.where(arr > 5, arr, 0) # 5 より大きい値を 0 に置換
# 複数の条件
result = np.where(arr > 5, 'high', 'low')
配列の操作とリシェイプ
リシェイプ:reshape() / resize() / flatten()
データを保持したまま配列の次元を変更します。
# リシェイプ (可能な場合はビューを作成)
arr.reshape(2, 3)
arr.reshape(-1, 1) # -1 は次元を推測
# リサイズ (元の配列を変更)
arr.resize((2, 3))
# 1D にフラット化
arr.flatten() # コピーを返す
arr.ravel() # 可能な場合はビューを返す
ログインしてこのクイズに回答し、学習の進捗を追跡できます
arr.reshape(-1, 1) における -1 は何を意味しますか?ログインしてこのクイズに回答し、学習の進捗を追跡できます
arr.reshape(-1, 1) における -1 は何を意味しますか?転置:T / transpose()
行列演算のために配列の軸を交換します。
# 単純な転置
arr2d.T
# 軸指定による転置
arr.transpose()
np.transpose(arr)
# より高次元の場合
arr3d.transpose(2, 0, 1)
要素の追加/削除
要素の追加または削除による配列サイズの変更。
# 要素の追加
np.append(arr, [4, 5])
# 特定の位置に挿入
np.insert(arr, 1, 99)
# 要素の削除
np.delete(arr, [1, 3])
# 要素の繰り返し
np.repeat(arr, 3)
np.tile(arr, 2)
配列の結合:concatenate() / stack()
複数の配列を結合します。
# 既存の軸に沿った結合
np.concatenate([arr1, arr2])
np.concatenate([arr1, arr2], axis=1)
# 配列をスタック (新しい軸を作成)
np.vstack([arr1, arr2]) # 垂直方向
np.hstack([arr1, arr2]) # 水平方向
np.dstack([arr1, arr2]) # 奥行き方向
数学的な操作
基本的な算術:+, -, *, /
配列に対する要素ごとの算術演算。
# 要素ごとの演算
arr1 + arr2
arr1 - arr2
arr1 * arr2 # 要素ごとの乗算
arr1 / arr2
arr1 ** 2 # 2 乗
arr1 % 3 # モジュロ演算
ユニバーサル関数 (ufuncs)
数学関数を要素ごとに適用します。
# 三角関数
np.sin(arr)
np.cos(arr)
np.tan(arr)
# 指数関数と対数関数
np.exp(arr)
np.log(arr)
np.log10(arr)
# 平方根とべき乗
np.sqrt(arr)
np.power(arr, 3)
集計関数
配列の次元にわたる要約統計量を計算します。
# 基本的な統計
np.sum(arr)
np.mean(arr)
np.std(arr) # 標準偏差
np.var(arr) # 分散
np.min(arr)
np.max(arr)
# 特定の軸に沿って
np.sum(arr2d, axis=0) # 行に沿った合計
np.mean(arr2d, axis=1) # 列に沿った平均
比較演算
ブール配列を返す要素ごとの比較演算。
# 比較演算子
arr > 5
arr == 3
arr != 0
# 配列比較
np.array_equal(arr1, arr2)
np.allclose(arr1, arr2) # 許容誤差内
# Any/all 演算
np.any(arr > 5)
np.all(arr > 0)
線形代数
行列演算:np.dot() / @
行列乗算とドット積を実行します。
# 行列乗算
np.dot(A, B)
A @ B # Python 3.5 以降の演算子
# 要素ごとの乗算
A * B
# 行列べき乗
np.linalg.matrix_power(A, 3)
分解:np.linalg
高度な計算のための行列分解。
# 固有値と固有ベクトル
eigenvals, eigenvecs = np.linalg.eig(A)
# 特異値分解
U, s, Vt = np.linalg.svd(A)
# QR 分解
Q, R = np.linalg.qr(A)
行列のプロパティ
重要な行列特性を計算します。
# 行列式
np.linalg.det(A)
# 行列の逆
np.linalg.inv(A)
# 擬似逆行列
np.linalg.pinv(A)
# 行列のランク
np.linalg.matrix_rank(A)
# トレース (対角要素の合計)
np.trace(A)
線形システムの解法:np.linalg.solve()
連立一次方程式を解きます。
# Ax = b を解く
x = np.linalg.solve(A, b)
# 最小二乗解
x = np.linalg.lstsq(A, b, rcond=None)[0]
配列の入出力
NumPy バイナリ:np.save() / np.load()
NumPy 配列のための効率的なバイナリ形式。
# 単一配列の保存
np.save('array.npy', arr)
# 配列の読み込み
loaded_arr = np.load('array.npy')
# 複数配列の保存
np.savez('arrays.npz', a=arr1, b=arr2)
# 複数配列の読み込み
data = np.load('arrays.npz')
arr1_loaded = data['a']
テキストファイル:np.loadtxt() / np.savetxt()
配列をテキストファイルとして読み書きします。
# CSV/テキストファイルからの読み込み
arr = np.loadtxt('data.csv', delimiter=',')
# ヘッダー行をスキップ
arr = np.loadtxt('data.csv', delimiter=',', skiprows=1)
# テキストファイルへの保存
np.savetxt('output.csv', arr, delimiter=',', fmt='%.2f')
構造化データを持つ CSV: np.genfromtxt()
欠損値処理を備えた高度なテキストファイル読み込み。
# 欠損値の処理
arr = np.genfromtxt('data.csv', delimiter=',',
missing_values='N/A', filling_values=0)
# 名前付き列
data = np.genfromtxt('data.csv', delimiter=',',
names=True, dtype=None)
メモリマップ:np.memmap()
メモリに収まらない配列を扱うために使用します。
# メモリマップ配列の作成
mmap_arr = np.memmap('large_array.dat', dtype='float32',
mode='w+', shape=(1000000,))
# 通常の配列のようにアクセスするが、ディスクに保存されている
mmap_arr[0:10] = np.random.random(10)
パフォーマンスとブロードキャスト
ブロードキャストのルール
異なる形状の配列に対する演算の処理方法を理解します。
# ブロードキャストの例
arr1 = np.array([[1, 2, 3]]) # 形状 (1, 3)
arr2 = np.array([[1], [2]]) # 形状 (2, 1)
result = arr1 + arr2 # 形状 (2, 3)
# スカラーのブロードキャスト
arr + 5 # 全要素に 5 を加算
arr * 2 # 全要素を 2 倍
ベクトル化された演算
Python ループの代わりに NumPy の組み込み関数を使用します。
# ループの代わりにベクトル化された演算を使用
# 悪い例:for ループ
result = []
for x in arr:
result.append(x ** 2)
# 良い例:ベクトル化
result = arr ** 2
# カスタムベクトル化関数
def custom_func(x):
return x ** 2 + 2 * x + 1
vec_func = np.vectorize(custom_func)
result = vec_func(arr)
メモリ最適化
大規模配列のメモリ使用効率を高めるためのテクニック。
# 適切なデータ型を使用
arr_int8 = arr.astype(np.int8) # 要素あたり 1 バイト
arr_float32 = arr.astype(np.float32) # float64 の代わりに 4 バイト
# ビューとコピー
view = arr[::2] # ビューを作成 (メモリを共有)
copy = arr[::2].copy() # コピーを作成 (新しいメモリ)
# 配列がビューかコピーかを確認
view.base is arr # ビューの場合は True
パフォーマンスのヒント
高速な NumPy コードのためのベストプラクティス。
# 可能な場合はインプレース操作を使用
arr += 5 # arr = arr + 5 の代わりに
np.add(arr, 5, out=arr) # 明示的なインプレース
# 中間配列の作成を最小限に抑える
# 悪い例:中間配列を作成
result = ((arr + 1) * 2) ** 2
# より良い例:可能な場合は複合演算を使用
乱数生成
基本的な乱数:np.random
様々な分布から乱数を生成します。
# ランダムな浮動小数点数 [0, 1)
np.random.random(5)
# ランダムな整数
np.random.randint(0, 10, size=5)
# 正規分布
np.random.normal(mu=0, sigma=1, size=5)
# 一様分布
np.random.uniform(-1, 1, size=5)
サンプリング:choice() / shuffle()
既存のデータからサンプリングしたり、配列を並べ替えたりします。
# 配列からのランダムな選択
np.random.choice(arr, size=3)
# 非復元抽出
np.random.choice(arr, size=3, replace=False)
# 配列をインプレースでシャッフル
np.random.shuffle(arr)
# ランダムな順列
np.random.permutation(arr)
シードとジェネレータ
再現性のために乱数を制御します。
# 再現性のためのシード設定
np.random.seed(42)
# 最新のアプローチ:Generator
rng = np.random.default_rng(42)
rng.random(5)
rng.integers(0, 10, size=5)
rng.normal(0, 1, size=5)
統計関数
記述統計
中心傾向とばらつきの基本的な統計量。
# 中心傾向
np.mean(arr)
np.median(arr)
# ばらつきの尺度
np.std(arr) # 標準偏差
np.var(arr) # 分散
np.ptp(arr) # ピークからピーク (max - min)
# パーセンタイル
np.percentile(arr, [25, 50, 75])
np.quantile(arr, [0.25, 0.5, 0.75])
相関と共分散
変数間の関係性を測定します。
# 相関係数
np.corrcoef(x, y)
# 共分散
np.cov(x, y)
# クロス相関
np.correlate(x, y, mode='full')
ヒストグラムとビニング
データの分布を分析し、ビンを作成します。
# ヒストグラム
counts, bins = np.histogram(arr, bins=10)
# 2D ヒストグラム
H, xedges, yedges = np.histogram2d(x, y, bins=10)
# デジタル化 (ビンインデックスの割り当て)
bin_indices = np.digitize(arr, bins)
特殊な統計関数
高度な統計計算。
# 加重統計
np.average(arr, weights=weights)
# 一意な値とカウント
unique_vals, counts = np.unique(arr, return_counts=True)
# ビンカウント (整数配列用)
np.bincount(int_arr)
NumPy のインストールとセットアップ
Pip: pip install numpy
標準的な Python パッケージインストーラ。
# NumPyをインストール
pip install numpy
# 最新バージョンにアップグレード
pip install numpy --upgrade
# 特定のバージョンをインストール
pip install numpy==1.21.0
# パッケージ情報を表示
pip show numpy
Conda: conda install numpy
Anaconda/Miniconda環境用のパッケージマネージャ。
# 現在の環境にNumPyをインストール
conda install numpy
# NumPyを更新
conda update numpy
# conda-forgeからインストール
conda install -c conda-forge numpy
# 環境を作成してNumPyをインストール
conda create -n myenv numpy
インストールの確認とインポート
NumPy のインストールを確認し、標準的なインポートを行います。
# 標準的なインポート
import numpy as np
# バージョンの確認
print(np.__version__)
# ビルド情報の表示
np.show_config()
# 印刷オプションの設定
np.set_printoptions(precision=2, suppress=True)
高度な機能
構造化配列
複雑なデータ構造のための名前付きフィールドを持つ配列。
# 構造化データ型の定義
dt = np.dtype([('name', 'U10'), ('age', 'i4'), ('weight', 'f4')])
# 構造化配列の作成
people = np.array([('Alice', 25, 55.0), ('Bob', 30, 70.5)], dtype=dt)
# フィールドへのアクセス
people['name']
people['age']
マスク配列:np.ma
欠損データや無効なデータを持つ配列を扱います。
# マスク配列の作成
masked_arr = np.ma.array([1, 2, 3, 4, 5], mask=[0, 0, 1, 0, 0])
# マスクされた値は演算で無視される
np.ma.mean(masked_arr)
# マスクされた値を埋める
filled = masked_arr.filled(0)
多項式:np.poly1d
多項式表現とその操作を扱います。
# 多項式の作成 (係数は降順)
p = np.poly1d([1, -2, 1]) # x² - 2x + 1
# 多項式の評価
p(5) # x=5 で評価
# 根の検索
np.roots([1, -2, 1])
# 多項式フィッティング
coeff = np.polyfit(x, y, degree=2)
高速フーリエ変換:np.fft
周波数領域解析と信号処理。
# 1D FFT
fft_result = np.fft.fft(signal)
# 周波数
freqs = np.fft.fftfreq(len(signal))
# 逆 FFT
reconstructed = np.fft.ifft(fft_result)
# 画像の 2D FFT
fft2d = np.fft.fft2(image)