Сохранение массива numpy в mongodb
У меня есть несколько документов MongoDB, в которых один из моих полей лучше всего представлен как матрица (массив numpy). Я хотел бы сохранить этот документ в MongoDB, как мне это сделать?
{
'name' : 'subject1',
'image_name' : 'blah/foo.png',
'feature1' : np.array(...)
}
Ответы
Ответ 1
Для массива 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'] )
Ответ 2
Мы создали библиотеку с открытым исходным кодом для хранения числовых данных (Pandas, numpy и т.д.) в MongoDB:
https://github.com/manahl/arctic
Лучше всего это очень легко использовать, довольно быстро и поддерживает управление версиями данных, несколько библиотек данных и многое другое.
Ответ 3
Вы пробовали Монари?
У них есть примеры на сайте
http://djcinnovations.com/index.php/archives/103
Ответ 4
Код pymongo.binary.Binary(...) не работал у меня, возможно, нам нужно использовать bson as
@tcaswell предложил.
В любом случае, это одно решение для многомерного массива 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'])
Сказав это, кредит будет MongoWrapper использовать написанный ими код.
Ответ 5
Попробуйте MongoWrapper, я думаю, это просто:
Объявить соединение с сервером и коллекцией mongodb для сохранения np.
import monogowrapper as mdb
db = mdb.MongoWrapper(dbName='test',
collectionName='test_collection',
hostname="localhost",
port="27017")
my_dict = {"name": "Important experiment",
"data":np.random.random((100,100))}
Словарь точно так же, как вы ожидаете:
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:
db.save(my_dict)
Для загрузки данных:
my_loaded_dict = db.load({"name":"Important experiment"})