Я работаю с результатами моделирования, хранящиеся в глубоко вложенной структуре дефолта. Эта структура (data_to_save) смешивает стандартные типы Python (списки, ints, floats, none) с массивами Numpy. < /P>
Мне нужно сохранить всю эту структуру data_to_save в файл json. Поскольку json.dump не может обращаться с массивами Numpy национально, и я использую Numpy 2.0 (где снимаются псевдонимы более старых типов), я написал пользовательскую рекурсивную функцию, make_json_serializable, для преобразования типов Numpy и решать потенциальные проблемы, такие как np.nan: < /p>
import numpy as np
import json
from collections import defaultdict
# Custom converter for NumPy types and NaNs
def make_json_serializable(obj):
if isinstance(obj, np.ndarray): return obj.tolist()
# Important: Handle defaultdict specifically before dict
if isinstance(obj, defaultdict): return {k: make_json_serializable(v) for k, v in obj.items()}
if isinstance(obj, dict): return {k: make_json_serializable(v) for k, v in obj.items()}
if isinstance(obj, list): return [make_json_serializable(i) for i in obj]
# Check base Python types first
if isinstance(obj, (int, float, bool, complex, str, type(None))): return obj
# Check abstract NumPy types (NumPy 2.0+)
if isinstance(obj, np.integer): return int(obj)
if isinstance(obj, np.floating): return float(obj) if not np.isnan(obj) else None # Convert NaN to None for JSON compatibility
if isinstance(obj, np.complexfloating): return {'real': float(obj.real), 'imag': float(obj.imag)}
if isinstance(obj, np.bool_): return bool(obj)
if isinstance(obj, (np.void)): return None
# Fallback if type not recognized
# print(f"Warning: Type {type(obj)} not explicitly handled. Passing as is.") # Optional debug
return obj
# --- END CONVERTER ---
# Example of the nested structure (simplified)
data_to_save = defaultdict(lambda: defaultdict(lambda: defaultdict(lambda: defaultdict(dict))))
data_to_save['category_A']['size_X']['config_1']['setting_alpha']['parameter_grid'] = np.linspace(0, 1, 5)
data_to_save['category_A']['size_X']['config_1']['setting_alpha']['metric_array_1'] = np.array([0.1, 0.2, 0.5, 0.8, 1.0])
data_to_save['category_A']['size_X']['config_1']['setting_alpha']['num_valid_entries'] = 5
data_to_save['category_A']['size_X']['config_1']['setting_alpha']['distribution_data'] = {
'0.5': {'size_values': [1, 2, 3], 'normalized_counts': np.array([0.5, 0.3, 0.2]), 'source_count': 5}
}
# ... structure can be deeply nested with more arrays ...
< /code>
Моя попытка сохранить эти данные результаты в TypeError: < /p>
# Current (failing) saving code:
output_filename = "output_data.json"
try:
# PROBLEM: This tries to dump the raw structure with NumPy arrays using the standard encoder
temp_dict_structure = json.loads(json.dumps(data_to_save)) #
Подробнее здесь: https://stackoverflow.com/questions/795 ... tom-conver
TypeError: объект типа ndarray не является сериализуемым JSON, несмотря на пользовательский конвертер (вложенный DICT/Nu ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Ошибка типа: объект типа ndarray не является сериализуемым в формате JSON.
Anonymous » » в форуме Python - 0 Ответы
- 72 Просмотры
-
Последнее сообщение Anonymous
-
-
-
TypeError: объект типа JobStatus(NewType) не является сериализуемым в формате JSON.
Anonymous » » в форуме Python - 0 Ответы
- 51 Просмотры
-
Последнее сообщение Anonymous
-