如果我有一个numpy dtype,我该如何自动将其转换为最接近的python数据类型?例如,
numpy.float32 -> "python float"
numpy.float64 -> "python float"
numpy.uint32 -> "python int"
numpy.int16 -> "python int"
Run Code Online (Sandbox Code Playgroud)
我可以尝试提出所有这些情况的映射,但是numpy是否提供了一些自动方式将其dtypes转换为最接近的可能的本机python类型?这种映射不一定是详尽无遗的,但它应该转换具有close python模拟的常见dtypes.我认为这已经发生在numpy的某个地方了.
我试图从python发送一个简单的字典到json文件,但我一直得到"TypeError:1425不是JSON可序列化"的消息.
import json
alerts = {'upper':[1425],'lower':[576],'level':[2],'datetime':['2012-08-08 15:30']}
afile = open('test.json','w')
afile.write(json.dumps(alerts,encoding='UTF-8'))
afile.close()
Run Code Online (Sandbox Code Playgroud)
如果我添加默认参数,那么它会写入,但整数值将作为字符串写入json文件,这是不可取的.
afile.write(json.dumps(alerts,encoding='UTF-8',default=str))
Run Code Online (Sandbox Code Playgroud) 我正在处理numpy.float32数字,但它们不适用JSON。解决此问题的正确方法是什么?
import numpy as np
import json
a = np.float32(1)
json.dumps(a)
TypeError: Object of type 'float32' is not JSON serializable
Run Code Online (Sandbox Code Playgroud) Numpy有很多不同的基本类型,所有这些都列在这里.
我已经在我的程序中找到了一个float32不能进行JSON序列化的问题,所以我开始测试上面列表中的所有数据类型:
>>> import numpy as np
>>> from json import dumps
>>> dumps(np.bool(True))
'true'
>>> dumps(np.bool_(True))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.4/json/__init__.py", line 230, in dumps
return _default_encoder.encode(obj)
File "/usr/lib/python3.4/json/encoder.py", line 192, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/lib/python3.4/json/encoder.py", line 250, in iterencode
return _iterencode(o, 0)
File "/usr/lib/python3.4/json/encoder.py", line 173, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: True is not JSON serializable
>>> …Run Code Online (Sandbox Code Playgroud) 我想传递一个我写入Flask jsonify函数的numpy JSON序列化器,但我找不到办法做到这一点.我无法使用json.dumps,因为我必须在处理错误消息时设置Flask响应的status_code.有没有办法将JSON序列化程序作为参数传递,类似于使用如下所示的cls参数json.dumps:将numpy类型转换为python?我的代码如下; 谢谢.
import json
import numpy as np
from flask import Flask, jsonify
class JSON_Improved(json.JSONEncoder):
'''
Used to help jsonify numpy arrays or lists that contain numpy data types.
'''
def default(self, obj):
if isinstance(obj, np.integer):
return int(obj)
elif isinstance(obj, np.floating):
return float(obj)
elif isinstance(obj, np.ndarray):
return obj.tolist()
else:
return super(MyEncoder, self).default(obj)
app = Flask(__name__)
@app.errorhandler(ErrorMessage)
def handle_invalid_usage(error):
response = jsonify(error.to_dict())
response.status_code = error.status_code
return response
Run Code Online (Sandbox Code Playgroud)