2015-04-27 2 views
3

Я пытаюсь сохранить несколько маринованных массивов Numpy в базе данных SQL. Массивы Numpy являются 3D и имеют вид (Name (text), Data (floats), Date (int).Numpy Array to SQL Table

Я сейчас делаю это следующим образом (для массива arr, содержащего данные и names и dates в качестве ссылок, содержащих фактические имена и даты соответствующих для arr)

name_size, ~, date_size = arr.shape 
for i in range(name_size): 
    for j in range(date_size): 
     insert_into_db(name[i], date[j], arr[i,:,j) 

Однако это очень медленно. Мне интересно, нет ли более эффективного способа, просто рассматривая объект arr в целом.

Например вставить ссылки в names и dates в базу данных, а затем как-то просто скопировать значения в arr прямо во всех сразу (где они упорядочены и правильно сплющенные со ссылкой на значения Name и Date мы имеем только вставлено.

+0

Почему вы используете SQL для протравливания NumPy массивы? вы всегда можете использовать модуль 'Pickle' для python для хранения почти всех объектов Python в файле' .p' и, при необходимости, доступа? Это уменьшит количество накладных расходов. – ZdaR

+1

Я не использую SQL для разборки, я создаю базу данных объектов, которые я ранее мариновал для более эффективного запроса. Формат маринованного объекта был массивом numpy, но это будет неактуально, как только информация будет вставлена ​​в базу данных. – rwolst

ответ

2

Если база данных не может содержать собственные массивы Numpy, вы можете использовать dumps или tostring методы.

dumps маринады данные в bytes объекта в Python 3.x и str в Python 2.x, который затем может быть сохранен в базе данных в виде последовательности строк или необработанных байтов. Уловка заключается в том, что формат рассола может изменяться между версиями python или numpy, поэтому другая версия numpy или python не обязательно сможет ее прочитать (хотя разработчики numpy стараются держать читатель рассола как можно более обратно совместимым):

testarr = np.arange(20) 
data = testarr.dumps() 

что дает вам (в питона 3.x, он отличается в Python 2.x):

b'\x80\x02cnumpy.core.multiarray\n_reconstruct\nq\x00cnumpy\nndarray\nq\x01K\x00\x85q\x02c_codecs\nencode\nq\x03X\x01\x00\x00\x00bq\x04X\x06\x00\x00\x00latin1q\x05\x86q\x06Rq\x07\x87q\x08Rq\t(K\x01K\x14\x85q\ncnumpy\ndtype\nq\x0bX\x02\x00\x00\x00i8q\x0cK\x00K\x01\x87q\rRq\x0e(K\x03X\x01\x00\x00\x00<q\x0fNNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK\x00tq\x10b\x89h\x03X\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x00\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00q\x11h\x05\x86q\x12Rq\x13tq\x14b.' 

tostring работает так же в том, что он преобразует массив в виде строки. Преимущество состоит в том, что он должен быть одинаковым для версий python и numpy, но имеет тот недостаток, что он не сохраняет размеры, поэтому вам нужно будет сохранить размеры (и будет ли массив C или Fortran заказа) в базы данных, чтобы правильно восстановить массив (если это не всегда то же самое):

testarr = np.arange(20) 
data = testarr.tostring() 

что дает вам (это будет то же самое в 2.x и 3.x Python, за исключением того, что в 3.x Python он будет быть тип bytes и в Python 2.x это будет str типа):

b'\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x00\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00' 
+0

Привет, TheBlackCat, может быть, мой вопрос был не совсем ясен. Теперь я больше не забочусь о том, что мой объект был массивом numpy, я просто хочу получить данные в массиве numpy в базе данных SQL. Фактически моя массив numpy в настоящее время действует как очень неэффективная база данных, которую я должен продолжать загружать в память и запрашивать. – rwolst