この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:3
ページ更新者:guest
更新日時:2026-06-11 07:07:02

タイトル: 多次元配列の作成
SEOタイトル: 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) はサイズ不一致でエラー。