Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 为什么BSON序列化的numpy阵列比原始阵列大得多?_Arrays_Python 3.x_Numpy_Serialization_Bson - Fatal编程技术网

Arrays 为什么BSON序列化的numpy阵列比原始阵列大得多?

Arrays 为什么BSON序列化的numpy阵列比原始阵列大得多?,arrays,python-3.x,numpy,serialization,bson,Arrays,Python 3.x,Numpy,Serialization,Bson,我正在处理numpy数组形式的图像。我需要在JSON中序列化/反序列化它们(我使用的是MongoDB) numpy数组不能用json.dump序列化;我知道,但我想知道是否有更好的方法,因为将bytes numpy数组转换为BSON会将字节数乘以几乎12(我不明白为什么): 字节数增加的原因是BSON如何保存数据。您可以在中找到此信息,但让我们看一个具体示例: import numpy as np import bson npdata = np.arange(5, dtype='B') * 1

我正在处理numpy数组形式的图像。我需要在JSON中序列化/反序列化它们(我使用的是MongoDB)

numpy数组不能用json.dump序列化;我知道,但我想知道是否有更好的方法,因为将bytes numpy数组转换为BSON会将字节数乘以几乎12(我不明白为什么):


字节数增加的原因是BSON如何保存数据。您可以在中找到此信息,但让我们看一个具体示例:

import numpy as np
import bson

npdata = np.arange(5, dtype='B') * 11
listdata = npdata.tolist()
bsondata = bson.BSON.encode({"rows": rows, "cols": cols, "data": listdata})

print([hex(b) for b in bsondata])
在这里,我们将一个数组的值
[0,11,22,33,44,55]
存储为BSON,并打印生成的二进制数据。下面我对结果进行了注释,以解释发生了什么:

['0x47', '0x0', '0x0', '0x0',  # total number of bytes in the document
 # First element in document
     '0x4',  # Array
     '0x64', '0x61', '0x74', '0x61', '0x0',  # key: "data"
     # subdocument (data array)
         '0x4b',  '0x0', '0x0', '0x0',  # total number of bytes
         # first element in data array
             '0x10',                        # 32 bit integer
             '0x30', '0x0',                 # key: "0"
             '0x0', '0x0', '0x0', '0x0',    # value: 0
         # second element in data array
             '0x10',                        # 32 bit integer
             '0x31', '0x0',                 # key: "1"
             '0xb', '0x0', '0x0', '0x0',    # value: 11
         # third element in data array
             '0x10',                        # 32 bit integer
             '0x32', '0x0',                 # key: "2"
             '0x16', '0x0', '0x0', '0x0',   # value: 22             
 # ...
]

除了一些格式开销外,数组的每个值都用7个字节进行了相当浪费的编码:1个字节用于指定数据类型,2个字节用于包含索引的字符串(3个字节用于索引>=10,4个字节用于索引>=100,…),4个字节用于32位整数值

这至少解释了为什么BSON数据比原始阵列大得多


我在BSON中找到了两个库,它们可以更好地编码麻木的数组。但是,我没有尝试过它们,因此我无法确定它们是否正确工作。

问题指出,您需要在JSON之间进行序列化,然后使用BSON。你真的需要哪一个?或者您是否正在寻找有效序列化阵列的方法?请澄清。您使用JSON与MongoDB通信,但MongoDB在幕后使用BSON。我想要的是一个合理的BSON大小。“包含索引的字符串有2个字节(三个字节表示索引>=10,四个字节表示索引>=100,…)”谢谢!需要将此添加到规范中。
['0x47', '0x0', '0x0', '0x0',  # total number of bytes in the document
 # First element in document
     '0x4',  # Array
     '0x64', '0x61', '0x74', '0x61', '0x0',  # key: "data"
     # subdocument (data array)
         '0x4b',  '0x0', '0x0', '0x0',  # total number of bytes
         # first element in data array
             '0x10',                        # 32 bit integer
             '0x30', '0x0',                 # key: "0"
             '0x0', '0x0', '0x0', '0x0',    # value: 0
         # second element in data array
             '0x10',                        # 32 bit integer
             '0x31', '0x0',                 # key: "1"
             '0xb', '0x0', '0x0', '0x0',    # value: 11
         # third element in data array
             '0x10',                        # 32 bit integer
             '0x32', '0x0',                 # key: "2"
             '0x16', '0x0', '0x0', '0x0',   # value: 22             
 # ...
]