TypeError:“ndarray”类型的对象不是JSON serializab

2024-06-26 10:12:03 发布

您现在位置:Python中文网/ 问答频道 /正文

knownEmbeddings = []
knownNames = []

for (i, imagePath) in enumerate(imagePaths):
    ## SOME CODE
    knownNames.append(name)
    knownEmbeddings.append(vec.flatten())


data = {"embeddings": knownEmbeddings, "names": knownNames}

f = open('file.json', "wb")
f.write(json.dumps(data, indent=4))
f.close()

以下是data的外观:

^{pr2}$

我需要把它保存在json文件中。当我调试时,data显示为dict类型,因此我使用json.dumps(data)将其保存在json文件中,但它引发以下错误:

TypeError: Object of type 'ndarray' is not JSON serializable

我怎么解决


Tags: 文件nameinjsonfordatacodesome
2条回答

data确实是dict,但它包含{}的列表,这些列表也需要序列化,并且不能(本机)序列化。在

这里您需要的是提供您自己的JSONEncoder,它知道如何处理ndarray(将它们转换成bharatk建议的列表是最明显的解决方案)。在

您想先转换成64位float的列表,例如

import json
import numpy as np

arr = np.array([1], dtype=np.float32)

json.dumps(list(arr))

给我:TypeError: Object of type float32 is not JSON serializable

如果在序列化为JSON之前将其转换为64位浮点值,则可以:

^{pr2}$

我成功地恢复了'[1.0]'

另外请注意,如果您有一个file对象,那么最好使用json.dump,例如,尝试执行以下操作:

with open('file.json', "wb") as f:
    f.write(json.dump(data, f, indent=4))

相关问题 更多 >