Python 在mongodb中保存numpy数组

Python 在mongodb中保存numpy数组,python,mongodb,numpy,nosql,Python,Mongodb,Numpy,Nosql,我有两个MongoDB文档,其中一个字段最好表示为矩阵(numpy数组)。我想将此文档保存到MongoDB,如何执行此操作 { 'name' : 'subject1', 'image_name' : 'blah/foo.png', 'feature1' : np.array(...) } 对于1D numpy阵列,可以使用列表: # serialize 1D array x record['feature1'] = x.tolist() # deserialize 1D array x x

我有两个MongoDB文档,其中一个字段最好表示为矩阵(numpy数组)。我想将此文档保存到MongoDB,如何执行此操作

{
'name' : 'subject1',
'image_name' : 'blah/foo.png',
'feature1' : np.array(...)
}

对于1D numpy阵列,可以使用列表:

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

# deserialize 1D array x
x = np.fromiter( record['feature1'] )
对于多维数据,我相信您需要使用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'] )

你试过Monary吗

他们在网站上有例子


代码pymongo.binary.binary(…)对我不起作用,可能是我们需要将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'])

话虽如此,这要归功于使用了他们编写的代码。

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

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

您尝试过吗,我认为它很简单:

声明与mongodb服务器和集合的连接以保存np。 这本字典和你想象的一样:

print my_dict
{'data': array([[ 0.773217,  0.517796,  0.209353, ...,  0.042116,  0.845194,
         0.733732],
       [ 0.281073,  0.182046,  0.453265, ...,  0.873993,  0.361292,
         0.551493],
       [ 0.678787,  0.650591,  0.370826, ...,  0.494303,  0.39029 ,
         0.521739],
       ..., 
       [ 0.854548,  0.075026,  0.498936, ...,  0.043457,  0.282203,
         0.359131],
       [ 0.099201,  0.211464,  0.739155, ...,  0.796278,  0.645168,
         0.975352],
       [ 0.94907 ,  0.363454,  0.912208, ...,  0.480943,  0.810243,
         0.217947]]),
 'name': 'Important experiment'}
将数据保存到mongo: 要加载回数据,请执行以下操作:
我知道这是一个老问题,但这里有一个优雅的解决方案,适用于pymongo的新版本:

导入pickle
从bson.binary导入binary,用户定义的子类型
从bson.codec\u选项导入TypeCodec、TypeRegistry、CodecOptions
将numpy作为np导入
NumpyCodec类(类型编解码器):
python_type=np.ndarray
bson_类型=二进制
def transform_python(自身,值):
返回二进制(pickle.load(值),用户定义的子类型)
def transform_bson(自身,值):
如果value.subtype==用户定义的子类型:
返回pickle.dumps(值,协议=2)
返回值
def get_编解码器_选项():
numpy_codec=NumpyCodec()
type\u registry=TypeRegistry([numpy\u编解码器])
编解码器\u选项=编解码器选项(类型\u注册表=类型\u注册表)
返回编解码器选项
def get_集合(名称,db):
编解码器\u选项=获取编解码器\u选项()
返回db.get\u集合(名称、编解码器选项=编解码器选项)
然后,您可以通过以下方式获得收藏:

从pymongo导入MongoClient
client=MongoClient()
db=客户机['my_db']
my_collection=get_collection('my_collection',db)

之后,您只需在数据库中插入和查找NUMPY数组。

您是否已经尝试过序列化(通过,例如,<代码>泡菜< /代码>)?而不是数据库替换,您也可以考虑PyTABLE(内置于HDF5)来存储您的NUMPY数组…这可以通过使用
pickle.dumps(y,protocol=2)
来改进,这会使数据的二进制表示更加紧凑和快速。此外,您可以尝试使用cpickle,它比pickle快1000倍,因为它是在较新版本(至少2.4)中用c:in实现的pymongo
binary的版本。binary
已移动到
bson
我一直收到一个错误:
TypeError:未找到必需的参数“dtype”(位置2)
关于@AlexGaudio使用
cPickle
的注释仅与Python 2相关。如今(Python3),这似乎是一种存储pandas数据帧并在其上运行查询(尤其是日期/时间列)的方法。
print my_dict
{'data': array([[ 0.773217,  0.517796,  0.209353, ...,  0.042116,  0.845194,
         0.733732],
       [ 0.281073,  0.182046,  0.453265, ...,  0.873993,  0.361292,
         0.551493],
       [ 0.678787,  0.650591,  0.370826, ...,  0.494303,  0.39029 ,
         0.521739],
       ..., 
       [ 0.854548,  0.075026,  0.498936, ...,  0.043457,  0.282203,
         0.359131],
       [ 0.099201,  0.211464,  0.739155, ...,  0.796278,  0.645168,
         0.975352],
       [ 0.94907 ,  0.363454,  0.912208, ...,  0.480943,  0.810243,
         0.217947]]),
 'name': 'Important experiment'}
db.save(my_dict)
my_loaded_dict = db.load({"name":"Important experiment"})