2017-09-28 65 views
2

我正在用numpy數組形式處理圖像。我需要序列化/反序列化他們到/從JSON(我正在使用MongoDB)爲什麼BSON系列化的numpy陣列比原來大得多?

numpy數組無法用json.dump序列化;我知道this,但我不知道是否有更好的辦法,因爲一個字節numpy的陣列到BSON轉換了近12相乘的字節數(我不明白爲什麼):

import numpy as np 
import bson 
from io import StringIO as sio 
RC = 500 
npdata = np.zeros(shape=(RC,RC,3), dtype='B') 
rows, cols, depth = npdata.shape 
npsize = rows*cols*depth 
npdata=npdata.reshape((npsize,)) 
listdata = npdata.tolist() 
bsondata = bson.BSON.encode({"rows": rows, "cols": cols, "data": listdata}) 
lb = len(bsondata) 
print(lb, npsize, lb/npsize) 

> 8888926 750000 11.851901333333334 
+1

該問題指出您需要序列化到/從JSON序列化,但是然後您使用BSON。你真的需要哪一個?或者你正在尋找* any *的方式來有效地序列化數組?請澄清。 – kazemakase

+0

您以JSON與MongoDB通信,但MongoDB在幕後使用BSON。我在尋找的是一個合理的BSON尺寸。 – Eduardo

回答

1

的這種增加字節數的原因是BSON如何保存數據。你可以找到在BSON specification此信息,但讓我們看一個具體的例子:

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個字節用於一個包含索引的字符串(索引> = 10的三個字節,索引> = 100的四個字節,...)以及32位整數值的4個字節。

這至少解釋了爲什麼BSON數據比原始數組大很多。

我發現了兩個庫GitHub - mongodb/bson-numpyGitHub - ajdavis/bson-numpy這可能會更好地編碼BSON中的numby數組。但是,我沒有嘗試過,所以我不能說這是否是這種情況,或者他們是否正確工作。