2.

NumPy 多次元配列の作成方法完全ガイド

編集
この記事の要点
  • 基本は np.array([[1,2,3],[4,5,6]])。リストのリストから ndarray を生成
  • ゼロ / 一 / 任意値: np.zeros / np.ones / np.full / np.empty
  • 連番: np.arange(0,12).reshape(3,4)、等間隔: np.linspace(0,1,5)、乱数: np.random.rand(3,4)
  • shape / ndim / size / dtype の 4 つを必ず確認。dtype=np.float32 で型を明示
  • インデックスは a[1,2] 形式が標準 (a[1][2] はテンポラリを生成するため遅い)

多次元配列とは

NumPy の ndarray (N-dimensional array) は、同じ型の要素が連続したメモリ上に格納された配列です。Python の組込みリストよりも圧倒的に高速 (C 実装) で、ベクトル演算 / 行列演算 / ブロードキャストなど数値計算に必要な機能を持ちます。

リストから作成

import numpy as np

# 1 次元 (ベクトル)
a = np.array([1, 2, 3, 4])
print(a)            # [1 2 3 4]
print(a.shape)      # (4,)
print(a.ndim)       # 1

# 2 次元 (行列)
b = np.array([[1, 2, 3],
              [4, 5, 6]])
print(b.shape)      # (2, 3)  → 2 行 3 列
print(b.ndim)       # 2
print(b.size)       # 6 (要素数の総数)

# 3 次元 (テンソル)
c = np.array([[[1, 2], [3, 4]],
              [[5, 6], [7, 8]]])
print(c.shape)      # (2, 2, 2)
print(c.ndim)       # 3

# dtype を明示
d = np.array([1, 2, 3], dtype=np.float32)
print(d.dtype)      # float32

形状指定で初期化

関数動作
np.zeros(shape)0 で埋めるnp.zeros((3,4))
np.ones(shape)1 で埋めるnp.ones((2,3,4))
np.full(shape, v)任意値で埋めるnp.full((3,3), -1)
np.empty(shape)初期化なし (高速だが値は不定)np.empty((1000,1000))
np.eye(n)単位行列np.eye(3)
np.identity(n)単位行列 (同上)np.identity(4)
np.zeros_like(a)a と同じ形状の 0 配列np.zeros_like(b)
import numpy as np

# 3 行 4 列のゼロ行列
z = np.zeros((3, 4))
print(z)
# [[0. 0. 0. 0.]
#  [0. 0. 0. 0.]
#  [0. 0. 0. 0.]]

# 整数型のゼロ
zi = np.zeros((2, 3), dtype=np.int32)

# 任意値で埋める
full = np.full((2, 3), 7)
# [[7 7 7]
#  [7 7 7]]

# 単位行列
e = np.eye(3)
# [[1. 0. 0.]
#  [0. 1. 0.]
#  [0. 0. 1.]]

連番 / 等間隔 / 乱数

import numpy as np

# 連番 (Python の range と同じ)
a = np.arange(12)
# [ 0  1  2  3  4  5  6  7  8  9 10 11]

# reshape で形状変換
b = np.arange(12).reshape(3, 4)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

# 等間隔 (0 〜 1 を 5 等分)
c = np.linspace(0, 1, 5)
# [0.   0.25 0.5  0.75 1.  ]

# 一様乱数 [0, 1)
np.random.seed(42)
r1 = np.random.rand(3, 4)

# 標準正規分布
r2 = np.random.randn(3, 4)

# 整数乱数 [0, 100)
r3 = np.random.randint(0, 100, size=(3, 4))

# 推奨: Generator API (NumPy 1.17+)
rng = np.random.default_rng(seed=42)
r4 = rng.uniform(0, 1, size=(3, 4))
r5 = rng.integers(0, 100, size=(3, 4))

dtype (データ型)

dtypeサイズ用途
np.int8 / int16 / int32 / int641 / 2 / 4 / 8 B整数
np.uint8 / uint16 / ...同上符号なし整数 (画像 0-255 等)
np.float16 / float32 / float642 / 4 / 8 B浮動小数
np.complex64 / complex1288 / 16 B複素数
np.bool_1 B真偽値
np.object_可変Python オブジェクト (低速)
import numpy as np

# 型変換 (新しい配列を返す)
a = np.array([1.5, 2.7, 3.9])
b = a.astype(np.int32)   # [1 2 3]  ← 切り捨て

# 型確認
print(a.dtype)           # float64
print(a.itemsize)        # 8 (1 要素のバイト数)
print(a.nbytes)          # 24 (合計バイト数)

インデックスとスライス

import numpy as np

a = np.arange(12).reshape(3, 4)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

# 単一要素 (推奨: カンマ区切り)
print(a[1, 2])      # 6
print(a[1][2])      # 6  ← 動くがテンポラリを作るので遅い

# 行ごと
print(a[0])         # [0 1 2 3]
print(a[:, 1])      # [1 5 9]      ← 列ごと

# スライス
print(a[0:2, 1:3])
# [[1 2]
#  [5 6]]

# 末尾から
print(a[-1])        # [ 8  9 10 11]
print(a[:, -1])     # [ 3  7 11]

# Boolean インデックス
mask = a > 5
print(a[mask])      # [ 6  7  8  9 10 11]

# Fancy インデックス
print(a[[0, 2]])    # 0 行目と 2 行目を抽出
# [[ 0  1  2  3]
#  [ 8  9 10 11]]

軸 (axis) の概念

多次元配列を扱う上で最重要なのが axis です。(行, 列) の配列なら axis=0 が行方向 (縦)、axis=1 が列方向 (横) です。

import numpy as np

a = np.array([[1, 2, 3],
              [4, 5, 6]])

# 全体の合計
print(a.sum())          # 21

# 列ごとの合計 (axis=0 を潰す → 行を縦に集計)
print(a.sum(axis=0))    # [5 7 9]

# 行ごとの合計 (axis=1 を潰す)
print(a.sum(axis=1))    # [ 6 15]

# 同じく mean / max / min / std もすべて axis を取れる
print(a.mean(axis=0))   # [2.5 3.5 4.5]
print(a.max(axis=1))    # [3 6]

形状変換 (reshape / ravel / flatten)

import numpy as np

a = np.arange(12)
# (12,)

# 3 行 4 列に
b = a.reshape(3, 4)
# (3, 4)

# -1 は自動推定
c = a.reshape(2, -1)    # (2, 6)
d = a.reshape(-1, 3)    # (4, 3)

# 1 次元化
e = b.ravel()           # ビュー (元データ共有)
f = b.flatten()         # コピー

# 軸入れ替え (転置)
g = b.T                 # (4, 3)
h = b.transpose()       # 同上

# 軸追加 / 削除
x = np.array([1, 2, 3])
y = x[np.newaxis, :]    # (1, 3)
z = x[:, np.newaxis]    # (3, 1)

FAQ

Q: np.zerosnp.empty の使い分けは?
A: 値が必要なら zeros、すぐ上書きするなら empty (初期化分の時間を節約)。1000x1000 で約 4 倍速い。

Q: shape の順序が直感と逆に感じる
A: (行数, 列数) = (高さ, 幅) です。画像処理では (H, W, C) = (高さ, 幅, チャネル) が標準。

Q: 要素数が合わずに reshape できない
A: 元の size と reshape 後の積が一致する必要があります。np.arange(10).reshape(3,4) はサイズ不一致でエラー。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 配列の作成
  2. 多次元配列の作成
  3. 要素の参照
  4. 要素の追加
  5. 要素の更新
  6. 要素の削除
  7. ブロードキャスト
  8. 多次元配列の構造の確認
  9. 多次元配列を1次元配列に変換
  10. 1次元配列を多次元配列に変換
  11. 要素の範囲指定
  12. 平均値の算出
  13. 行列を結合する方法