ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
flatten() と ravel() の違い
NumPy で多次元配列を 1 次元にする代表的な 2 つのメソッド:
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6]])
print(a.shape) # (2, 3)
# 方法1: flatten(常にコピー)
b = a.flatten()
print(b) # [1 2 3 4 5 6]
print(b.shape) # (6,)
b[0] = 99
print(a[0, 0]) # 1 (元は変わらない)
# 方法2: ravel(可能なら view)
c = a.ravel()
print(c) # [1 2 3 4 5 6]
c[0] = 99
print(a[0, 0]) # 99 (元も変わる!)
| flatten() | ravel() | reshape(-1) | |
|---|---|---|---|
| 戻り値 | 新しい配列(コピー) | 可能なら view | 可能なら view |
| メモリ使用 | 2 倍 | 同じ | 同じ |
| 速度 | 遅い(コピー発生) | 速い | 速い |
| 元配列への影響 | なし(安全) | あり(view 時) | あり(view 時) |
| 連続でない配列 | OK | コピー発生 | コピー発生 |
reshape(-1) を使う方法
a = np.arange(24).reshape(2, 3, 4)
print(a.shape) # (2, 3, 4)
# -1 は「残り全部」の意味
b = a.reshape(-1)
print(b.shape) # (24,)
print(b)
# [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]
# 多次元 → 別の多次元も可能
c = a.reshape(6, 4)
d = a.reshape(-1, 4) # 行は自動計算
C-order と F-order
1 次元化のとき、要素を取り出す順序を指定できます:
a = np.array([[1, 2, 3],
[4, 5, 6]])
# C-order(行優先、デフォルト)
print(a.flatten(order='C'))
# [1 2 3 4 5 6] ← 行を順に並べる
# F-order(列優先、Fortran)
print(a.flatten(order='F'))
# [1 4 2 5 3 6] ← 列を順に並べる
# K-order(メモリレイアウトに従う)
print(a.flatten(order='K'))
# C 配列なら C 順、F 配列なら F 順
# A-order(C 連続なら C、それ以外は F)
print(a.flatten(order='A'))
| order | 意味 | 用途 |
|---|---|---|
| C | 行優先(NumPy デフォルト) | Python / C と相性良 |
| F | 列優先(Fortran) | MATLAB / 線形代数で使用 |
| K | メモリ順 | 最速 |
| A | 連続性優先 | あまり使われない |
np.concatenate と np.stack
複数の配列を結合して 1 次元化する場合:
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
# concatenate: 既存の軸に沿って結合
c = np.concatenate([a.ravel(), b.ravel()])
# [1 2 3 4 5 6 7 8]
# または直接 reshape
c = np.concatenate([a, b], axis=None)
# axis=None で自動 1 次元化
# [1 2 3 4 5 6 7 8]
# np.hstack / np.vstack
d = np.hstack([a, b]) # 横方向(axis=1)
# [[1 2 5 6]
# [3 4 7 8]]
e = np.vstack([a, b]) # 縦方向(axis=0)
# [[1 2] [3 4] [5 6] [7 8]]
Python のリスト内包表記との比較
import numpy as np
a = np.arange(1_000_000).reshape(1000, 1000)
# 方法1: Python ループ(遅い)
flat_py = [x for row in a for x in row]
# 約 200ms
# 方法2: numpy.ravel(速い)
flat_np = a.ravel()
# 約 0.001ms (20万倍速い)
# 速度差の理由:
# - Python ループは要素ごとに Python オブジェクト化
# - NumPy はメモリレイアウトをそのまま使う(コピー不要なら)
メモリ効率の違い
import numpy as np
import sys
a = np.arange(10_000_000)
print(a.nbytes / 1024 / 1024, "MB") # 76 MB
# flatten はコピー → 倍の 152 MB を使う
b = a.flatten()
# ravel は view → 元と同じメモリ
c = a.ravel()
print(c.base is a) # True(同じデータを共有)
print(b.base) # None(独立)
view と copy の判定
ravel / reshape が view を返せないケースもあるので確認方法:
a = np.arange(12).reshape(3, 4)
b = a.ravel()
print(b.base is a) # True (view)
# 連続でない配列(slice 等で抜き出した場合)
c = a[:, ::2] # 1 つ飛ばしで列を抜く
print(c.flags.c_contiguous) # False
d = c.ravel()
print(d.base is a) # False (コピーになった)
# 明示的に view を強制
e = c.reshape(-1)
# これはエラーになる場合あり
# 確実に view を取りたいなら .ravel(order='K')
f = c.ravel(order='K')
PyTorch / TensorFlow の同等関数
| NumPy | PyTorch | TensorFlow |
|---|---|---|
arr.flatten() | tensor.flatten() | tf.reshape(t, [-1]) |
arr.ravel() | tensor.view(-1) | 同上 |
arr.reshape(-1) | tensor.reshape(-1) | 同上 |
arr.flatten(order="F") | 非対応 | 非対応 |
機械学習での典型例
# CNN の出力を全結合層に通すとき
batch_size, channels, h, w = 32, 64, 7, 7
features = np.random.randn(batch_size, channels, h, w)
# (32, 64, 7, 7) → (32, 3136) に変換
flattened = features.reshape(batch_size, -1)
print(flattened.shape) # (32, 3136)
# 画像 1 枚のピクセルベクトル化
image = np.random.randint(0, 256, (28, 28), dtype=np.uint8)
vector = image.flatten() # shape (784,)
FAQ
Q: flatten した結果を変更しても元配列が変わる
A: flatten はコピーなので変わらないはず。ravel や reshape(-1) なら view なので変わる。
Q: 巨大配列で flatten がメモリエラー
A: コピーが必要なので元の 2 倍メモリを要求する。ravel を使うか、ジェネレータで chunk 処理に切替。
Q: 順序を維持したまま列優先で取り出したい
A: .flatten(order="F") または .T.ravel()(転置 → ravel)。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子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
コメントを削除してもよろしいでしょうか?