Сохранение массива numpy в mongodb

19

У меня есть несколько документов MongoDB, в которых один из моих полей лучше всего представлен как матрица (массив numpy). Я хотел бы сохранить этот документ в MongoDB, как мне это сделать?

{
'name' : 'subject1',
'image_name' : 'blah/foo.png',
'feature1' : np.array(...)
}
    
задан Dat Chu 16.06.2011 в 07:43
источник
  • Вы пробовали сериализацию (через, скажем, рассол)? –  Amber 16.06.2011 в 07:53
  • В то время как не замена базы данных, вы также можете рассмотреть pytables (построен на hdf5), чтобы хранить вам массивы numpy ... pytables.org/moin –  Alex Gaudio 27.06.2012 в 01:43
  • Вот сравнение производительности для различных методов. –  Jon 01.07.2015 в 14:41

5 ответов

22

Для массива 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'] )
    
ответ дан jeff7 16.06.2011 в 19:55
источник
  • Это можно улучшить, используя pickle.dumps (y, protocol = 2), что приводит к более компактному и быстрому двоичному представлению данных. –  pv. 16.06.2011 в 23:03
  • Кроме того, вы можете попробовать cpickle, который может быть до 1000 раз быстрее, чем рассол, потому что он реализован в c: docs.python.org/library/pickle.html#module-cPickle –  Alex Gaudio 27.06.2012 в 01:40
  • В более новых (не менее 2,4) версиях pymongo binary.Binary был перемещен в bson –  tacaswell 08.01.2013 в 17:38
  • Я продолжаю получать ошибку: TypeError: Требуемый аргумент 'dtype' (pos 2) не найден –  Rich 07.04.2018 в 10:59
4

Мы создали библиотеку с открытым исходным кодом для хранения числовых данных (Pandas, numpy и т. д.) в MongoDB:

Ссылка

Лучше всего это очень легко использовать, довольно быстро и поддерживает управление версиями данных, несколько библиотек данных и многое другое.

    
ответ дан James Blackburn 28.07.2015 в 09:58
источник
3

Код 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 , используя код, написанный ими.     

ответ дан Somum 05.03.2014 в 11:14
источник
2

Вы пробовали Монари?

У них есть примеры на сайте

Ссылка

    
ответ дан vgoklani 27.11.2012 в 16:59
источник
1

Попробуйте 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"})
    
ответ дан Pamungkas Jayuda 05.12.2017 в 11:08
источник