TypeError: Object of type ndarray is not JSON serializable の対処

結論を先に。このエラーは、numpyの配列(ndarray)や np.int64・np.float32 といった型を、そのまま json.dumps に渡したために起きます。JSONはPythonの標準型しか扱えないので、配列は .tolist()、スカラーは int()/float() で変換してから渡します。

TypeError: Object of type ndarray is not JSON serializable

原因

json モジュールが直接シリアライズできるのは、dict・list・str・int・float・bool・None などの標準型だけです。numpyの ndarray や numpy独自の数値型はこれに含まれないため、変換されずにエラーになります。

対処

  1. 配列は .tolist() でPythonのリストに変換します。
import json, numpy as np
arr = np.array([1, 2, 3])
json.dumps({"data": arr.tolist()})
  1. スカラー(np.int64 など)は Python の int/float に直します。
value = np.float32(3.14)
json.dumps({"v": float(value)})
  1. 変換対象が多いときは、default にカスタム関数を渡してまとめて処理します。
def conv(o):
if isinstance(o, np.ndarray):
return o.tolist()
if isinstance(o, np.integer):
return int(o)
if isinstance(o, np.floating):
return float(o)
raise TypeError(o)
json.dumps(obj, default=conv)

まとめ

  • 原因は numpy の型が JSON 標準型でないこと
  • 配列は .tolist()、スカラーは int()/float()
  • 数が多ければ json.dumps の default にカスタム変換を渡す
  • APIやファイル出力の前に numpy 型を標準型へ寄せておく