Python基礎

【保存版】NumPy基礎:配列・ブロードキャスト・ベクトル化・乱数・線形代数を“実務の型”で最短習得

結論:pandasの土台はNumPyです。データ分析や機械学習で速く・正確に前処理を進めるには、Pythonのfor文ではなく配列演算(=ベクトル化)に乗せるのが近道。本記事は、未経験〜初学者が週10時間×1〜2週で、ndarrayの基礎→dtype/shape→スライス/ビュー→ブロードキャスト→集約/軸→条件抽出→欠損/外れ値処理→乱数→線形代数までを“実務の型”で習得できるよう設計。コピペOKのレシピミニプロジェクトレビュー観点チェックリストを配布します。

この記事で身に付く力

  • NumPy配列(ndarray)の正しい扱い方:dtype/shape/strideの基礎理解
  • ベクトル化とブロードキャストで“速くて壊れにくい”前処理
  • 乱数Generatorを用いた再現性あるデータ生成
  • np.linalgの“最短セット”で線形代数を安全運用

関連記事:
>>【超入門】Pythonの基本文法:変数・型・演算子・条件分岐・ループを一気に攻略(保存版)
>>【保存版】pandas基礎:データフレームの作成・整形・結合・集計を“実務の型”で身につける
>>【実務で差がつく】pandas実践:欠損処理・結合・ウィンドウ関数・時系列・品質保証まで“読みやすく速い”型を習得
>>【保存版】可視化入門:Matplotlib/Plotlyの使い分けと“伝わるグラフ設計”10ステップ
>>【保存版】Jupyter Notebookの基本:環境構築・使い方・再現性・“読みやすいノート”設計まで完全ガイド
>>【保存版】scikit-learn基礎:回帰・分類・前処理・パイプライン・交差検証を“実務の型”で習得
>>【保存版】モデル評価:指標の選び方・交差検証・閾値最適化・ビジネス接続を“実務の型”で解説

よくあるつまずき(最初に避けたい落とし穴)

  • shape/dtypeが曖昧で、ValueError: operands could not be broadcast
  • スライスのビュー/コピーを誤解し、元配列が意図せず書き換わる
  • for文で集計し、遅い&バグりやすいコードになる。

対策:まずは配列の3点セット(shape/dtype/stride)ブロードキャストのルールを押さえ、基本はベクトル化で書く。

現場10年の学び(ふみとの失敗談込み)

筆者(ふみと)はデータ/マーケティングサイエンティスト歴10年。初期はpandasでfor文を多用して処理が日を跨ぐことも…。
そこでNumPyで前処理の7割を安定化してからpandas/可視化へ橋渡しする運用に切り替えたところ、速度と再現性が劇的に改善。このページはその運用をそのまま“型”に落とし込んだものです。

NumPy“実務の型” 12ステップ(Python 3.10+ / NumPy 1.26+)

各ステップはJupyterでimport numpy as npからスタート。コードはコピペでOKです。

1) ndarrayの作成と基本属性

import numpy as np

x = np.array(\[1, 2, 3], dtype=np.int64)
A = np.array(\[\[1., 2., 3.], \[4., 5., 6.]])
A.shape, A.ndim, A.dtype  # ((2, 3), 2, dtype('float64'))

ポイント

dtype(整数/浮動/真偽)とshape(行×列)/ ndim(次元)を常に確認。

2) ゼロ/ワン/等差・乱数での初期化

np.zeros((3,4)), np.ones(5), np.arange(0, 10, 2)
np.linspace(0, 1, 5)

# 乱数(新API: Generator)

rng = np.random.default\_rng(42)
rng.normal(loc=0, scale=1, size=(2,3))

判断基準

乱数はGeneratorで固定種(シード)を使い再現性を担保。

3) スライスとビュー/コピー

B = np.arange(10)

view = B\[2:7]     # ビュー(同じバッファを参照)
view\[:] = -1
B                  # 元も変わる

copy = B\[2:7].copy()
copy\[:] = 9
B                  # 元は変わらない

注意

スライス=ビューが基本。独立させたい時は.copy()

4) 形状変換(reshape/transpose/ravel)

C = np.arange(12).reshape(3,4)   # 行優先(C-order)
C.T.shape                         # 転置(4,3)
C.ravel(order='C')                # 1次元ビュー(可能なら)

原則:reshapeは要素数一定、転置は表示/計算順序に影響。

5) ブロードキャスト(次元合わせの規則)

X = np.ones((3,4))
v = np.array([1,2,3,4])
X + v  # 末尾次元(4)が一致→行方向にvが“伸びる”

# 列方向に足したい:

col = np.array(\[10,20,30]).reshape(3,1)
X + col

法則

後ろから見てサイズ一致 or 1なら拡張可。例:(3,4)(4,)(3,1)はOK、(2,4)はNG。

6) 集約(axis)と数値安定化

D = np.array([[1,2,3],[4,5,6]])
D.sum(), D.sum(axis=0), D.mean(axis=1)

# 数値安定:大きな配列の合計はdtypeを上げる

E = np.array(\[1e10, 1, -1e10], dtype=np.float32)
E.sum(dtype=np.float64)  # 桁落ち対策

目安:axis=0は列方向(縦集計)、axis=1は行方向(横集計)。必要ならdtype昇格

7) 条件抽出・ブーリアンインデックス

arr = np.array([5, -2, 7, 0])
mask = arr > 0
arr[mask]             # 正の要素

arr = arr.astype(float)
arr\[arr == 0] = np.nan  # 浮動小数に昇格(NaNを扱うため)

複数条件:括弧+&/|(ビット演算)を使用:(a>0) & (b<1)

8) 欠損/外れ値の扱い

rng = np.random.default_rng(42)
x = rng.normal(size=1000)
x[rng.integers(0, 1000, 20)] = np.nan

np.nanmean(x), np.nanstd(x)

# 外れ値クリップ(中央値±3\*IQR 風の簡易)

q1, q3 = np.nanpercentile(x, \[25, 75])
iqr = q3 - q1
x\_clip = np.clip(x, q1 - 3*iqr, q3 + 3*iqr)

方針を明文化:nan*系関数を使い、除外/補完/クリップの基準をREADMEに記載。

9) 結合・分割・スタック

A = np.arange(6).reshape(2,3)
B = np.arange(100,106).reshape(2,3)

np.concatenate(\[A,B], axis=0)  # 行方向
np.hstack(\[A,B])               # 列方向(axis=1)
np.vstack(\[A,B])               # 行方向(axis=0)
np.split(A, 2, axis=0)         # 2つに分割

先に寸法確認:hstack/vstackは2D配列ではaxis=1/0の糖衣。

10) 乱数(新API)と再現性

rng = np.random.default_rng(42)
rng.uniform(0, 1, 5)
rng.normal(0, 1, (2,3))
rng.integers(0, 10, 4)
rng.choice([0,1], size=10, replace=True)

運用ルール:default_rng(seed)をプロジェクトで統一。古いnp.randomは避ける

11) 線形代数(np.linalg)最短メモ

M = np.array([[3., 2.], [1., 2.]])
b = np.array([2., 0.])

sol = np.linalg.solve(M, b)        # 連立一次方程式
w, V = np.linalg.eig(M)            # 固有値・固有ベクトル
U, s, VT = np.linalg.svd(M)        # 特異値分解

np.linalg.cond(M)                  # 条件数の確認

注意:解く前に条件数/正則性を確認し、必要ならスケーリング。

12) ベクトル化の威力(for文をやめる)

# 例:ユークリッド距離(各行の長さ)
rng = np.random.default_rng(42)
P = rng.normal(size=(10000, 3))

# 悪い例:for

# lens = np.array(\[np.sqrt((p\*p).sum()) for p in P])

# 良い例:ベクトル化

lens = np.sqrt((P\*P).sum(axis=1))

型で考える:まず配列化→軸を決める→集約。pandasは.valuesでNumPyへ落とすのも有効。

スクール活用という選択肢(レビューで事故率を下げる)

独学でも到達できますが、ベクトル化設計外れ値/欠損方針のレビューがあると事故率が激減。
6ヶ月ロードマップのpandas実務と直結させるなら、下記2校の無料カウンセリングから始めるのが近道です。

TechAcademy データサイエンスコース(受講料:174,600円~ ※更に割引あり)

TechAcademy 無料相談

株式会社キカガク AI人材長期育成コース(受講料:237,600円~)

キカガク 無料相談

ミニプロジェクト(提出推奨)

課題:「乱数で合成した売上データ(10000行)に対し、外れ値クリップ→月次合計→前年比NumPyのみで計算し、pandasでExcelに書き出す」

  1. rng = np.random.default_rng(42)で乱数生成。
  2. ym(YYYY-MM)をchoiceで作り、qty×priceで売上を生成。
  3. percentile/IQRで外れ値をクリップ。
  4. unique==のブロードキャストで月次合計を計算(for禁止)。
  5. 前年比を計算し、pandasでreport.xlsxに保存。

レビュー観点(チェックリスト)

  • shape/dtypeの把握(コメント付き)
  • ベクトル化でforを排除
  • nan*関数で欠損を安全に処理
  • Generatorで再現性(seed固定)
  • Excel出力まで上から実行で通る([内部リンク:Jupyter Notebookの基本])

付録A:よく使う関数リスト(最短版)

  • 生成:zeros/ones/empty/arange/linspace
  • 形状:reshape/transpose/ravel/expand_dims/squeeze
  • 集約:sum/mean/std/var/min/max/percentilenan*系も)
  • 条件:where/clip、論理:logical_and/or/not
  • 乱数:default_rng().normal/uniform/integers/choice
  • 線形代数:dot/matmul@)、solve/eig/svd

付録B:性能チューニングの超要点

  • メモリ連続性(C-order/F-order)を意識。ascontiguousarrayで揃える。
  • 小さな繰り返しはベクトル化、巨大行列はBLAS/LAPACKを呼ぶ演算(dot/solve)に寄せる。
  • コピーを減らす:ビュー活用、astype(copy=False)

この記事から次に読むべきもの(内部リンク)

スキルアップ
【保存版】pandas基礎:データフレームの作成・整形・結合・集計を“実務の型”で身につける

データ分析の9割は前処理と整形です。ここをpandasで素早く正確にこなせるかが、成果物の質と速度を決めます。本記事は未経験〜初学者が週10時間×2〜3週で、pandasの基礎(読み込み/選択/整形/ ...

スキルアップ
【実務で差がつく】pandas実践:欠損処理・結合・ウィンドウ関数・時系列・品質保証まで“読みやすく速い”型を習得

リード(結論)基礎を終えたら次は実務の現場で頻出する処理を“型”で覚える段階です。本記事は、pandas 2.x を前提に、欠損・外れ値・結合・ウィンドウ関数・時系列・カテゴリ処理・集計の自動化・大規 ...

機械学習
【保存版】scikit-learn基礎:回帰・分類・前処理・パイプライン・交差検証を“実務の型”で習得

機械学習で迷子になる最大の理由は、前処理→学習→評価→改善の順番が曖昧なまま個々のアルゴリズムに飛びつくこと。本記事は、未経験〜初学者が週10時間×2〜3週で到達できるscikit-learnの最短ル ...

可視化
【保存版】可視化入門:Matplotlib/Plotlyの使い分けと“伝わるグラフ設計”10ステップ

結論:可視化は「きれいに描く」ことではなく、意思決定を動かすための設計です。本稿では、未経験〜初学者が 週10時間×1〜2週 で、Matplotlib/Plotlyを軸に “伝わるグラフ”の設計と実装 ...

SQL
はじめてのSQL:SELECT/WHERE/GROUP BYを最短で理解【コピペOK】

データ分析・自動レポート・簡易アプリの土台はSQLです。Pythonだけで押し切るより、前処理の7割をDB側で完結させる方が速く・安定します。本記事は、未経験〜初学者が週10時間×2〜3週で、SELE ...

最近のコメント

    • この記事を書いた人
    • 最新記事

    ふみと

    このブログでは、データサイエンティストとして市場価値を上げる方法を独自にまとめて発信しています。

    【プロフィール】
    ・大手企業データサイエンティスト/マーケティングサイエンティスト(10年、年収900万円台)/案件100件以上
    ・資格:JDLA E資格(日本ディープラーニング協会主催)/JDLA Community(CDLE会員)/Advanced Marketer/ビジネス統計スペシャリスト/統計検定2級/TOEIC 805
    ・スキル:Python/Tableau/SQL/機械学習/Deep Learning/RPA

    -Python基礎