使用Json转储2D Python数组

2024-04-20 10:14:07 发布

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

我有一个numpy数组,我想用Json转储它。数组如下所示:

array([['foo', 'bar', 'something', ...
        'more'],
        ['0.4', '0.7', '0.83', ...
        '0.3', '0.62', '0.51']]

我想用Json将它转储到字符串上,如下所示:

foo: 0.4
bar: 0.7
something: 0.51
...

我试过:

import jason
my_string = json.dumps(my_array)

但它抱怨道:

"not JSON serializable"

关于如何使用Json将其转储到字符串上有什么想法吗?

更新:

请不要以为我在乎订购,行应按以下顺序打印:

array[0,0] : array[0,1]
array[1,0] : array[1,1]
array[2,0] : array[2,1]
# etc ...

Tags: 字符串importnumpyjsonstringfoomymore
3条回答

不确定JSON可序列化部分,但可以先将其转换为dict?这似乎是JSON输出更自然的格式,可以处理数据类型的任何问题。

my_dict = dict(zip(my_array[1], my_array[0]))

对我有用的是-因为有更大的1024x102 float64数组-转换为base64。

def Base64Encode(ndarray):
    return json.dumps([str(ndarray.dtype),base64.b64encode(ndarray),ndarray.shape])
def Base64Decode(jsonDump):
    loaded = json.loads(jsonDump)
    dtype = np.dtype(loaded[0])
    arr = np.frombuffer(base64.decodestring(loaded[1]),dtype)
    if len(loaded) > 2:
        return arr.reshape(loaded[2])
    return arr

''' just to compare '''
def SimpleEncode(ndarray):
    return json.dumps(ndarray.tolist())
def SimpleDecode(jsonDump):
    return np.array(json.loads(jsonDump))

ipython%timeit结果非常清楚地指向base64:

arr = np.random.random_sample((1000, 1000))

print 'Simple Convert'
%timeit SimpleDecode(SimpleEncode(arr))
print 'Base64 Encoding'
%timeit Base64Decode(Base64Encode(arr))

结果:

Simple Convert
1 loops, best of 3: 1.42 s per loop
Base64 Encoding
10 loops, best of 3: 171 ms per loop

如果所有值都是数字,则在其他操作失败时,始终可以手动执行:

my_array = [['0.4', '0.7', '0.83', '0.3', '0.62', '0.51'],
            ['foo', 'bar', 'something', 'more']]

pairs = zip(my_array[1], my_array[0])
json_values = ('"{}": {}'.format(label, value) for label, value in pairs)
my_string = '{' + ', '.join(json_values) + '}'

print my_string # '{"foo": 0.4, "bar": 0.7, "something": 0.83, "more": 0.3}'

相关问题 更多 >