JSON не может обрабатывать тип float128 numpy - PullRequest
1 голос
/ 24 мая 2019

Мне нужно выгрузить numy массивы dtype float128 в JSON. Для этого я написал собственный кодировщик массива, который правильно обрабатывает массивы, вызывая для них tolist(). Это прекрасно работает для всех реальных dtypes, кроме float128. Смотрите следующий пример:

import json
import numpy as np


class ArrayEncoder(json.JSONEncoder):
    def default(self, o):
        if isinstance(o, np.ndarray):
            out = {'__ndarray__': True,
                   '__dtype__': o.dtype.str,
                   'data': o.tolist()}
            return out
        return json.JSONEncoder.default(self, o)

arr64 = np.array([1, 2, 3], dtype='float64')
arr128 = np.array([1, 3, 4], dtype='float128')

json.dumps(arr64, cls=ArrayEncoder)     # fine
json.dumps(arr128, cls=ArrayEncoder)    # TypeError

TypeError: Объект типа float128 не поддерживает сериализацию JSON

Цель кодировщика - предоставить данные в формате, который может обрабатывать JSON. В этом случае данные преобразуются в список простых плавающих объектов Python, что не должно создавать никаких проблем. Возможным решением было бы изменить строку преобразования в кодере на

class ArrayEncoder(json.JSONEncoder):
    def default(self, o):
        ...
            'data': o.astype('float64').tolist()
        ...

Я, однако, заинтересован в причине проблемы. Почему JSON вызывает ошибку, даже если он использует кодировщик, который предоставляет данные в сериализуемом формате?

...