在mongodb中保存numpy数组

Dat*_*Chu 22 python numpy mongodb nosql

我有几个MongoDB文档,其中一个我的字段最好表示为矩阵(numpy数组).我想将此文档保存到MongoDB,我该怎么做?

{
'name' : 'subject1',
'image_name' : 'blah/foo.png',
'feature1' : np.array(...)
}
Run Code Online (Sandbox Code Playgroud)

jef*_*ff7 26

对于1D numpy数组,您可以使用列表:

# serialize 1D array x
record['feature1'] = x.tolist()

# deserialize 1D array x
x = np.fromiter( record['feature1'] )
Run Code Online (Sandbox Code Playgroud)

对于多维数据,我相信你需要使用pickle和pymongo.binary.Binary:

# serialize 2D array y
record['feature2'] = pymongo.binary.Binary( pickle.dumps( y, protocol=2) ) )

# deserialize 2D array y
y = pickle.loads( record['feature2'] )
Run Code Online (Sandbox Code Playgroud)

  • 在较新的(至少2.4)版本的pymongo`binary.Binary`已被转移到`bson` (6认同)
  • 这可以通过使用`pickle.dumps(y,protocol = 2)`来改进,这导致数据的更紧凑和快速的二进制表示. (3认同)
  • 此外,您可以尝试cpickle,它可以比pickle快1000倍,因为它在c中实现:http://docs.python.org/library/pickle.html#module-cPickle (2认同)

Som*_*mum 5

代码pymongo.binary.Binary(...)对我不起作用,可能是我们需要使用@tcaswell建议的bson。

无论如何,这里是多维numpy数组的一种解决方案

>>from bson.binary import Binary
>>import pickle
# convert numpy array to Binary, store record in mongodb
>>record['feature2'] = Binary(pickle.dumps(npArray, protocol=2), subtype=128 )
# get record from mongodb, convert Binary to numpy array
>> npArray = pickle.loads(record['feature2'])
Run Code Online (Sandbox Code Playgroud)

话虽这么说,但归功于MongoWrapper使用了他们编写的代码。

  • 目前正在 2022 年进行 (2认同)

Jam*_*urn 5

我们已经构建了一个开源库,用于在 MongoDB 中存储数字数据(Pandas、numpy 等):

https://github.com/manahl/arctic

最重要的是,它非常易于使用,速度非常快,并且支持数据版本控制、多个数据库等。