programing

numpy 배열을 mongodb에 저장하는 중

megabox 2023. 7. 8. 10:47
반응형

numpy 배열을 mongodb에 저장하는 중

MongoDB 문서 두 개가 있는데, my the fields 중 하나가 매트릭스(numpy array)로 가장 잘 표현됩니다.이 문서를 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'] )

다차원 데이터의 경우 피클과 피몬고를 사용해야 할 것 같습니다.이진.이진:

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

# deserialize 2D array y
y = pickle.loads( record['feature2'] )

코드 피몽고.바이너리.바이너리(...)는 저에게 효과가 없었습니다. 아마도 우리는 @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'])

그렇긴 하지만, 그들이 작성한 코드를 사용한 MongoWrapper에게 크레딧이 전달됩니다.

MongoDB에 숫자 데이터(Pandas, numpy 등)를 저장할 수 있는 오픈 소스 라이브러리를 구축했습니다.

https://github.com/manahl/arctic

무엇보다 사용이 간편하고 속도가 빠르며 데이터 버전 관리, 여러 데이터 라이브러리 등을 지원합니다.

이것이 오래된 질문이라는 것을 알지만 새로운 버전의 피몽고에서 작동하는 우아한 해결책이 있습니다.

import pickle
from bson.binary import Binary, USER_DEFINED_SUBTYPE
from bson.codec_options import TypeCodec, TypeRegistry, CodecOptions
import numpy as np

class NumpyCodec(TypeCodec):
    python_type = np.ndarray
    bson_type = Binary

    def transform_python(self, value):
        return Binary(pickle.loads(value), USER_DEFINED_SUBTYPE)

    def transform_bson(self, value):
        if value.subtype == USER_DEFINED_SUBTYPE:
            return pickle.dumps(value, protocol=2)
        return value

def get_codec_options():
    numpy_codec = NumpyCodec()
    type_registry = TypeRegistry([numpy_codec])
    codec_options = CodecOptions(type_registry=type_registry)
    return codec_options

def get_collection(name, db):
    codec_options = get_codec_options()
    return db.get_collection(name, codec_options=codec_options)

그런 다음 다음과 같은 방법으로 수집을 수행할 수 있습니다.

from pymongo import MongoClient
client = MongoClient()
db = client['my_db']
my_collection = get_collection('my_collection', db)

그런 다음 데이터베이스에 Numpy 배열을 투명하게 삽입하고 찾기만 하면 됩니다.

모나리 해봤어요?

그들은 사이트에 예시를 가지고 있습니다.

http://djcinnovations.com/index.php/archives/103

MongoWrapper를 사용해 본 적이 있습니까, 저는 단순하다고 생각합니다:

np를 저장할 mongodb 서버 및 수집에 대한 연결을 선언합니다.

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"})

언급URL : https://stackoverflow.com/questions/6367589/saving-numpy-array-in-mongodb

반응형