NumPy配列(ndarray)とPythonリストを相互変換する方法【完全ガイド2025】
データ処理において、NumPy配列(ndarray)とPython標準のリストを相互に変換する場面は非常に多くあります。本記事では、効率的で確実な変換方法を実践的なサンプルコードと共に詳しく解説します。
NumPy配列とPythonリストの違い
変換方法を学ぶ前に、それぞれの特徴を理解しておくことが重要です。
NumPy配列(ndarray)の特徴:
- 同一データ型の要素で構成
- 高速な数値計算に最適化
- メモリ効率が良い
- 多次元配列をサポート
Pythonリストの特徴:
- 異なるデータ型を混在可能
- 動的サイズ変更が可能
- Python標準機能で処理しやすい
- ネストした構造を直感的に扱える
Pythonリスト → NumPy配列への変換
1. 基本的な1次元リスト変換
import numpy as np
# 1次元リストをNumPy配列に変換
py_list = [1, 2, 3, 4, 5]
np_array = np.array(py_list)
print(np_array) # [1 2 3 4 5]
print(type(np_array)) # <class 'numpy.ndarray'>
2. 2次元リスト(ネストリスト)の変換
# ネストしたリストを2次元配列に変換
nested_list = [[1, 2, 3], [4, 5, 6]]
np_array_2d = np.array(nested_list)
print(np_array_2d)
# [[1 2 3]
# [4 5 6]]
print(np_array_2d.shape) # (2, 3)
3. データ型を指定した変換
# データ型を明示的に指定
int_list = [1, 2, 3, 4]
float_array = np.array(int_list, dtype=np.float64)
print(float_array) # [1. 2. 3. 4.]
print(float_array.dtype) # float64
4. 異なるデータ型が混在するリストの処理
# 混合データ型のリスト
mixed_list = [1, 2.5, 'text', True]
mixed_array = np.array(mixed_list, dtype=object)
print(mixed_array) # [1 2.5 'text' True]
NumPy配列 → Pythonリストへの変換
1. 基本的な変換(tolist()メソッド)
# NumPy配列をPythonリストに変換
np_array = np.array([10, 20, 30, 40])
py_list = np_array.tolist()
print(py_list) # [10, 20, 30, 40]
print(type(py_list)) # <class 'list'>
2. 多次元配列のリスト変換
# 2次元配列をネストリストに変換
np_array_2d = np.array([[1, 2], [3, 4], [5, 6]])
nested_list = np_array_2d.tolist()
print(nested_list) # [[1, 2], [3, 4], [5, 6]]
3. 特定の軸に沿った変換
# 各行をリストとして取得
np_array = np.array([[1, 2, 3], [4, 5, 6]])
row_lists = [row.tolist() for row in np_array]
print(row_lists) # [[1, 2, 3], [4, 5, 6]]
実践的なサンプルコード
サンプル1: 成績データの処理
import numpy as np
# 学生の成績リスト(国語、数学、英語)
scores_list = [[80, 75, 85], [90, 88, 92], [70, 72, 78]]
# NumPy配列に変換して統計計算
scores_array = np.array(scores_list)
subject_avg = np.mean(scores_array, axis=0)
# 結果をリストに戻して表示
avg_list = subject_avg.tolist()
subjects = ['国語', '数学', '英語']
for subject, avg in zip(subjects, avg_list):
print(f"{subject}の平均: {avg:.1f}点")
サンプル2: 売上データの月次集計
# 日次売上データ(リスト形式)
daily_sales = [
[100, 120, 110], # 1週目
[130, 140, 135], # 2週目
[115, 125, 105] # 3週目
]
# NumPy配列で効率的な計算
sales_array = np.array(daily_sales)
weekly_total = np.sum(sales_array, axis=1)
daily_avg = np.mean(sales_array, axis=0)
# 結果をリスト形式で出力
print("週次売上合計:", weekly_total.tolist())
print("曜日別平均:", daily_avg.tolist())
サンプル3: 画像データの処理
# RGB値のリスト(簡単な例)
rgb_list = [[[255, 0, 0], [0, 255, 0]],
[[0, 0, 255], [255, 255, 0]]]
# NumPy配列に変換してグレースケール化
rgb_array = np.array(rgb_list)
grayscale = np.mean(rgb_array, axis=2)
# 処理結果をリストに戻す
grayscale_list = grayscale.tolist()
print("グレースケール値:", grayscale_list)
パフォーマンスと効率性の考慮
大容量データの処理
# 大きなリストの効率的な変換
large_list = list(range(100000))
# NumPy配列への変換(高速)
large_array = np.array(large_list)
# 数値計算の実行
result = np.sqrt(large_array)
# 必要な部分のみリストに変換
result_subset = result[:10].tolist()
print("最初の10件:", result_subset)
メモリ効率の最適化
# データ型を最適化した変換
small_numbers = [1, 2, 3, 4, 5]
# int8で十分な場合
compact_array = np.array(small_numbers, dtype=np.int8)
print("メモリ使用量:", compact_array.nbytes, "bytes")
# リストに戻す
back_to_list = compact_array.tolist()
print("変換結果:", back_to_list)
特殊な変換パターン
1. 条件付きフィルタリング
# 条件に合う要素のみを抽出
data_list = [1, 5, 10, 15, 20, 25]
data_array = np.array(data_list)
# 10以上の要素のみを抽出してリスト化
filtered = data_array[data_array >= 10].tolist()
print("10以上の値:", filtered) # [10, 15, 20, 25]
2. 形状変更を伴う変換
# 1次元リストを2次元配列に変換
flat_list = [1, 2, 3, 4, 5, 6]
reshaped = np.array(flat_list).reshape(2, 3)
print("2x3配列:")
print(reshaped)
# 再びリストに変換
back_to_nested = reshaped.tolist()
print("ネストリスト:", back_to_nested)
3. 型変換を伴う処理
# 文字列リストを数値配列に変換
str_list = ['1.5', '2.7', '3.9']
num_array = np.array(str_list, dtype=float)
print("数値配列:", num_array)
# 計算後にリストに戻す
processed = (num_array * 2).tolist()
print("2倍した値:", processed)
よくあるエラーと対処法
1. 形状が不一致なネストリスト
# 不均一なネストリストの処理
irregular_list = [[1, 2], [3, 4, 5], [6]]
try:
# 直接変換すると形状エラー
array = np.array(irregular_list)
except ValueError as e:
print("エラー:", e)
# object配列として作成
obj_array = np.array(irregular_list, dtype=object)
print("オブジェクト配列:", obj_array)
2. データ型の暗黙変換
# 異なる型が混在する場合の挙動
mixed_list = [1, 2.5, 3]
mixed_array = np.array(mixed_list)
print("配列の型:", mixed_array.dtype) # float64
print("変換結果:", mixed_array.tolist()) # [1.0, 2.5, 3.0]
3. 空のリスト・配列の処理
# 空のリストの処理
empty_list = []
if empty_list:
empty_array = np.array(empty_list)
else:
print("リストが空です")
empty_array = np.array([], dtype=float)
print("空配列:", empty_array)
print("リストに戻す:", empty_array.tolist())
ベストプラクティス
1. データ型の明示的指定
# データ型を明示して予期しない変換を回避
data = [1, 2, 3, 4]
array = np.array(data, dtype=np.int32)
result = array.tolist()
2. エラーハンドリング
def safe_list_to_array(data, dtype=None):
"""安全なリスト→配列変換"""
try:
return np.array(data, dtype=dtype)
except (ValueError, TypeError) as e:
print(f"変換エラー: {e}")
return np.array(data, dtype=object)
# 使用例
test_data = [1, 'text', 3.5]
safe_array = safe_list_to_array(test_data)
3. パフォーマンス重視の変換
# 大量データの効率的な処理
def efficient_conversion(large_list):
"""効率的な変換処理"""
# 一度に変換してから処理
array = np.array(large_list)
processed = np.square(array) # 数値計算
return processed.tolist()
# 使用例
big_data = list(range(1000))
result = efficient_conversion(big_data)
まとめ
NumPy配列とPythonリストの相互変換は、データ処理の基礎技術です。重要なポイント:
リスト → NumPy配列
np.array()
関数を使用- データ型の明示的指定が重要
- 不均一なリストは
dtype=object
で対処
NumPy配列 → リスト
.tolist()
メソッドが最も確実- 多次元配列も自動的にネストリストに変換
- 型情報は保持される
最適化のポイント
- 大容量データはNumPy配列で処理してから必要部分のみリスト化
- データ型の最適化でメモリ効率を向上
- エラーハンドリングの実装
これらの変換技術を適切に使い分けることで、PythonとNumPyの長所を最大限に活用したデータ処理が実現できます。
■プロンプトだけでオリジナルアプリを開発・公開してみた!!
■AI時代の第一歩!「AI駆動開発コース」はじめました!
テックジム東京本校で先行開始。
■テックジム東京本校
「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。
<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。
<月1開催>放送作家による映像ディレクター養成講座
<オンライン無料>ゼロから始めるPython爆速講座