ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
ブロードキャストの最小例
import numpy as np
# 配列 + スカラー (最も単純なブロードキャスト)
a = np.array([1, 2, 3])
b = a + 5
print(b) # [6 7 8]
# 内部的に [5,5,5] を作って加算するイメージ
# 実際にはメモリ拡張はしない
# 行ベクトル + 列ベクトル
row = np.array([1, 2, 3]) # shape (3,)
col = np.array([[10], [20], [30]]) # shape (3, 1)
result = row + col
print(result)
# [[11 12 13]
# [21 22 23]
# [31 32 33]]
# row が (1, 3) と (3, 1) → 共通の (3, 3) に展開
ブロードキャスト規則
NumPy は次のルールで「2 つの形状を合わせる」ことを試みます:
- 形状の末尾の次元から順に比較
- 次元数が違う場合、足りない側の先頭に 1 を補う
- 各次元について、サイズが 同じ か どちらかが 1 なら適合
- サイズが 1 の側を、もう一方のサイズに「仮想的に」拡張
- どちらの条件も満たさない次元があれば
ValueError
| shape A | shape B | 結果 | 判定 |
|---|---|---|---|
| (3,) | スカラー | (3,) | OK |
| (3,) | (3,1) | (3,3) | OK |
| (3,4) | (4,) | (3,4) | OK (末尾 4 が一致、先頭に 1 補う) |
| (3,4) | (3,) | エラー | NG (末尾 4 と 3 が不一致) |
| (3,4) | (3,1) | (3,4) | OK (末尾 1 → 4 に展開) |
| (2,3,4) | (4,) | (2,3,4) | OK |
| (2,3,4) | (3,4) | (2,3,4) | OK |
| (2,3,4) | (2,1,4) | (2,3,4) | OK |
typical なパターン
パターン1: 各列に異なる値を足す
import numpy as np
a = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]) # (3, 3)
offsets = np.array([10, 20, 30]) # (3,)
# offsets が (1, 3) として全行に適用される
print(a + offsets)
# [[11 22 33]
# [14 25 36]
# [17 28 39]]
パターン2: 各行に異なる値を足す
import numpy as np
a = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]) # (3, 3)
row_offsets = np.array([[100],
[200],
[300]]) # (3, 1)
print(a + row_offsets)
# [[101 102 103]
# [204 205 206]
# [307 308 309]]
パターン3: 各行を平均で正規化
import numpy as np
data = np.array([[1.0, 2.0, 3.0],
[4.0, 5.0, 6.0]]) # (2, 3)
# 行ごとの平均 (axis=1) を求めると (2,) → keepdims=True で (2, 1) に
mean = data.mean(axis=1, keepdims=True) # (2, 1)
normalized = data - mean
# [[-1. 0. 1.]
# [-1. 0. 1.]]
パターン4: 外積を計算
import numpy as np
x = np.array([1, 2, 3, 4]) # (4,)
y = np.array([10, 20, 30]) # (3,)
# x を (4, 1)、y を (1, 3) にしてブロードキャスト
outer = x[:, np.newaxis] * y[np.newaxis, :]
# (4, 3)
# [[ 10 20 30]
# [ 20 40 60]
# [ 30 60 90]
# [ 40 80 120]]
# 同等
outer2 = np.outer(x, y)
np.newaxis で次元追加
import numpy as np
a = np.array([1, 2, 3]) # (3,)
# 行ベクトル化 (1, 3)
row = a[np.newaxis, :]
# = a.reshape(1, 3)
# = a[None, :] ← None でも同じ
# 列ベクトル化 (3, 1)
col = a[:, np.newaxis]
# = a.reshape(3, 1)
# = a[:, None]
print(row.shape, col.shape) # (1, 3) (3, 1)
# よくある: 距離行列の計算
points = np.array([[0, 0], [1, 0], [0, 1]]) # (3, 2)
diff = points[:, np.newaxis, :] - points[np.newaxis, :, :]
# (3, 1, 2) - (1, 3, 2) → (3, 3, 2)
dist = np.sqrt((diff ** 2).sum(axis=-1)) # (3, 3)
ブロードキャストでよくあるエラー
ValueError: operands could not be broadcast together with shapes (3,4) (3,)
原因: (3,4) の末尾 4 と (3,) の末尾 3 が一致せず、かつどちらも 1 でない。
import numpy as np
a = np.zeros((3, 4))
b = np.array([1, 2, 3]) # (3,)
# ❌ a + b → ValueError
# 末尾の次元 4 vs 3 が不一致
# ✅ 解決1: b を列ベクトルに
print(a + b[:, np.newaxis]) # (3, 4)
# ✅ 解決2: そもそも b のサイズが間違っているなら直す
b = np.array([1, 2, 3, 4])
print(a + b) # (3, 4)
メモリ効率
ブロードキャストは仮想的に拡張するだけで、実際に拡張したサイズのメモリは確保しません。これにより、巨大な配列でも効率的に演算できます。
import numpy as np
# 良い: ブロードキャスト
a = np.ones((10000, 10000)) # 800 MB
b = np.arange(10000) # 80 KB
c = a + b # b は仮想的に (10000, 10000) 扱い
# 追加メモリは b の 80 KB のみ
# 悪い: 明示的に拡張
b_expanded = np.tile(b, (10000, 1)) # ← 800 MB を新規確保
c = a + b_expanded # 結果も 800 MB
# 合計で 2.4 GB 必要
明示的ブロードキャストの可視化
import numpy as np
a = np.array([1, 2, 3]) # (3,)
b = np.array([[10], [20]]) # (2, 1)
# どんな形状にブロードキャストされるか
shape = np.broadcast_shapes(a.shape, b.shape)
print(shape) # (2, 3)
# 実際の展開を見たい場合
ab, bb = np.broadcast_arrays(a, b)
print(ab.shape, bb.shape) # (2, 3) (2, 3)
FAQ
Q: ブロードキャストはどこまで自動的に効く?
A: 二項演算 (+, -, *, /) と多くの ufunc (np.add, np.sin 等) に効きます。np.dot や @ 行列積では効きません (専用ルール)。
Q: keepdims=True とは?
A: sum / mean / max 等で「集計後の次元を残す」オプション。これを付けると後段のブロードキャストが楽になります。
Q: ブロードキャストすると遅いことはある?
A: 通常は速いですが、極端に大きな仮想拡張は CPU キャッシュミスを引き起こします。最終結果が GB 単位になるなら、ループや一括処理を見直してください。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページ
子ページはありません
同階層のページ
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Laravel キャッシュクリア完全ガイド(cache:clear / config:clear / 2026-05-18 07:42:07
- プロジェクトの作成と削除 2026-05-18 07:42:07
- インストール直後にNetbeansが反応しない 2026-05-18 07:42:07
- 動画やチャンネルの検索 2026-05-18 07:42:07
- APIキー取得方法 2026-05-18 07:42:07
- チャンネル情報の取得 2026-05-18 07:42:07
- API 入門 — Web API(REST / GraphQL / gRPC / 2026-05-18 07:42:07
- インストール(eclipseプラグイン) 2026-05-18 07:42:07
- Laravel「Dotenv values containing spaces must be surrounded 2026-05-18 07:42:07
- エラー一覧 2026-05-18 07:42:07
- curl: (51) SSL: certificate subject name '~' does not match 2026-05-18 07:42:07
- インストール方法(Windows版) 2026-05-18 07:42:07
- JSONから配列に変換 2026-05-18 07:42:07
- 処理を一定時間待つ 2026-05-18 07:42:07
- A non well formed numeric value encountered 2026-05-18 07:42:07
コメントを削除してもよろしいでしょうか?