在创建NumPy数组后,并将其保存为Django上下文变量,我在加载网页时收到以下错误:

array([   0,  239,  479,  717,  952, 1192, 1432, 1667], dtype=int64) is not JSON serializable

这是什么意思?


当前回答

使用NumpyEncoder它将处理json转储成功。NumPy数组不是JSON序列化的

import numpy as np
import json
from numpyencoder import NumpyEncoder
arr = array([   0,  239,  479,  717,  952, 1192, 1432, 1667], dtype=int64) 
json.dumps(arr,cls=NumpyEncoder)

其他回答

使用NumpyEncoder它将处理json转储成功。NumPy数组不是JSON序列化的

import numpy as np
import json
from numpyencoder import NumpyEncoder
arr = array([   0,  239,  479,  717,  952, 1192, 1432, 1667], dtype=int64) 
json.dumps(arr,cls=NumpyEncoder)

此外,还有一些关于Python中的列表与数组的非常有趣的信息~> Python列表与数组-何时使用?

可以注意到,一旦我在将数组保存到JSON文件中之前将其转换为列表,无论如何,在我现在的部署中,一旦我读取该JSON文件以供以后使用,我就可以继续以列表形式使用它(而不是将其转换回数组)。

在我看来,AND在屏幕上作为一个列表(逗号分隔)比数组(非逗号分隔)看起来更好。

使用上面的@travelingbones的.tolist()方法,我一直在使用这样的方法(捕捉一些我发现的错误):

保存字典

def writeDict(values, name):
    writeName = DIR+name+'.json'
    with open(writeName, "w") as outfile:
        json.dump(values, outfile)

读字典

def readDict(name):
    readName = DIR+name+'.json'
    try:
        with open(readName, "r") as infile:
            dictValues = json.load(infile)
            return(dictValues)
    except IOError as e:
        print(e)
        return('None')
    except ValueError as e:
        print(e)
        return('None')

希望这能有所帮助!

下面是一个为我工作的实现,并删除了所有的nan(假设这些是简单的对象(list或dict)):

from numpy import isnan

def remove_nans(my_obj, val=None):
    if isinstance(my_obj, list):
        for i, item in enumerate(my_obj):
            if isinstance(item, list) or isinstance(item, dict):
                my_obj[i] = remove_nans(my_obj[i], val=val)

            else:
                try:
                    if isnan(item):
                        my_obj[i] = val
                except Exception:
                    pass

    elif isinstance(my_obj, dict):
        for key, item in my_obj.iteritems():
            if isinstance(item, list) or isinstance(item, dict):
                my_obj[key] = remove_nans(my_obj[key], val=val)

            else:
                try:
                    if isnan(item):
                        my_obj[key] = val
                except Exception:
                    pass

    return my_obj

你也可以使用default参数,例如:

def myconverter(o):
    if isinstance(o, np.float32):
        return float(o)

json.dump(data, default=myconverter)

使用json。转储默认kwarg:

Default应该是一个函数,用于无法序列化的对象. ...或引发TypeError

在默认函数中检查对象是否来自模块numpy,如果是,则使用ndarray。对ndarray使用列表,对任何其他numpy特定类型使用.item。

import numpy as np

def default(obj):
    if type(obj).__module__ == np.__name__:
        if isinstance(obj, np.ndarray):
            return obj.tolist()
        else:
            return obj.item()
    raise TypeError('Unknown type:', type(obj))

dumped = json.dumps(data, default=default)