一个numpy int64的坑

本文介绍了一个关于使用TensorFlow进行预测时遇到的JSON序列化错误,并详细解释了如何排查并解决该问题,主要涉及到numpy.int64类型与Python原生整型之间的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天跑一个tensorflow代码,由于最后结果需要导出为json的文件,所以采用了json.dumps直接写文件,但是一直报错:

Traceback (most recent call last):
  File "predict_test.py", line 62, in <module>
    json.dump(submit, fw)
  File "/home/tensorflow/.pyenv/versions/3.5.3/lib/python3.5/json/__init__.py", line 178, in dump
    for chunk in iterable:
  File "/home/tensorflow/.pyenv/versions/3.5.3/lib/python3.5/json/encoder.py", line 427, in _iterencode
    yield from _iterencode_list(o, _current_indent_level)
  File "/home/tensorflow/.pyenv/versions/3.5.3/lib/python3.5/json/encoder.py", line 324, in _iterencode_list
    yield from chunks
  File "/home/tensorflow/.pyenv/versions/3.5.3/lib/python3.5/json/encoder.py", line 403, in _iterencode_dict
    yield from chunks
  File "/home/tensorflow/.pyenv/versions/3.5.3/lib/python3.5/json/encoder.py", line 324, in _iterencode_list
    yield from chunks
  File "/home/tensorflow/.pyenv/versions/3.5.3/lib/python3.5/json/encoder.py", line 436, in _iterencode
    o = _default(o)
  File "/home/tensorflow/.pyenv/versions/3.5.3/lib/python3.5/json/encoder.py", line 179, in default
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: 26 is not JSON serializable

输入图片说明

蒙蔽了很久,怎么26这个数字不可以serializable??

定位到报错代码位置,报错代码如下:

top_indices = []
submit = []
for i in range(n):
    diction = {}
    diction["label_id"] = list(preds[i].argsort()[-3:][::-1])
    diction["image_id"] = id_list[i]
    submit.append(diction)

with open('submit.plk','w') as fw:
    json.dump(submit, fw)

好像没有什么问题呀~??

做了个小测试:

In [2]: a = submit[1]

In [3]: a
Out[3]: 
{'image_id': 'c532ed79f6c54fb3cf8c45004656e385079a5284.jpg',
 'label_id': [25, 13, 15]}

In [4]: b = {'image_id': 'c532ed79f6c54fb3cf8c45004656e385079a5284.jpg',
   ...:  'label_id': [25, 13, 15]}

In [5]: json.dumps(b)
Out[5]: '{"image_id": "c532ed79f6c54fb3cf8c45004656e385079a5284.jpg", "label_id": [25, 13, 15]}'

In [6]: a == b
Out[6]: True

In [7]: json.dumps(a)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-9-373a2a7edfd2> in <module>()
...
TypeError: 25 is not JSON serializable

明明a 的值 和b 相等,为什么b就可以json.dumps,而 a json.dumps报错,懵逼一会,想想要不查看下25这个对象,原来对于a来说 25 是一个<type 'numpy.int64'>!!!

被狠狠地坑了半个小时~~由于平时做数据处理大家会经常用到numpy的array,所以大家也要注意,虽然都是整形,但numpy.int64和python的整数是不一样的,解决方案,可以用astype('in32t')或者直接用python的int()方法。

转载于:https://my.oschina.net/Kanonpy/blog/1543791

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值