Чтение массивов за пределами Python - PullRequest
4 голосов
/ 28 апреля 2010

В недавнем вопросе я спросил о самом быстром способе преобразования большого массива с нулевыми значениями в строку с разделителями. Моя причина была в том, что я хотел взять эту текстовую строку и передать ее (например, через HTTP) клиентам, написанным на других языках программирования. Строка чисел с разделителями - это то, с чем может легко работать любая клиентская программа. Тем не менее, было высказано предположение, что поскольку преобразование строк выполняется медленно, на стороне Python будет быстрее выполнять кодирование base64 в массиве и отправлять его в двоичном виде. Это действительно быстрее.

Мой вопрос сейчас таков: (1) как я могу убедиться, что мой закодированный массив NumPy хорошо подходит для клиентов на разных операционных системах и на другом оборудовании, и (2) как мне декодировать двоичные данные на стороне клиента. 1005 *

Для (1) я склонен сделать что-то вроде следующего

import numpy as np
import base64
x = np.arange(100, dtype=np.float64)
base64.b64encode(x.tostring())

Что-нибудь еще мне нужно сделать?

Для (2) я был бы рад иметь пример на любом языке программирования, где цель состоит в том, чтобы взять массив с плавающей точкой и превратить их в аналогичную собственную структуру данных. Предположим, что мы уже выполнили декодирование base64 и имеем байтовый массив, и что мы также знаем numpy dtype, размеры и любые другие метаданные, которые понадобятся.

Спасибо.

Ответы [ 4 ]

3 голосов
/ 13 июня 2011

Вам действительно стоит заглянуть в OPeNDAP , чтобы упростить все аспекты организации научных данных. Для Python, проверьте Pydap .

Вы можете напрямую хранить массивы NumPy в формате HDF5 с помощью h5py (или NetCDF), а затем передавать данные клиентам по протоколу HTTP с помощью OPeNDAP.

1 голос
/ 22 августа 2013

Для чего-то немного более легкого, чем HDF (хотя, по общему признанию, и более специального), вы также можете использовать JSON:

import json
import numpy as np

x = np.arange(100, dtype=np.float64)

print json.dumps(dict(data=x.tostring(),
                      shape=x.shape,
                      dtype=str(x.dtype)))

Это избавит ваших клиентов от необходимости устанавливать обертки HDF за счет необходимости иметь дело с нестандартным протоколом для обмена данными (и, возможно, также потребуется установить привязки JSON!).

Компромисс будет зависеть от вас, чтобы оценить вашу ситуацию.

1 голос
/ 28 апреля 2010

Я бы рекомендовал использовать существующий формат данных для обмена научными данными / массивами, например, NetCDF или HDF . В Python вы можете использовать библиотеку PyNIO , которая имеет пустые привязки, и есть несколько библиотек для других языков. Оба формата созданы для обработки больших данных и учитывают язык, проблемы с представлением машин и т. Д. Они также хорошо работают с передачей сообщений, например, в параллельных вычислениях, поэтому я подозреваю, что ваш вариант использования удовлетворен.

0 голосов
/ 28 апреля 2010

Метод tostring для массивов numpy в основном дает вам дамп памяти, используемой данными массива (не оберткой объекта для Python, а только данными массива). Это похоже на struct модуль stdlib. Base64-кодирование этой строки и ее передача должны быть достаточно хорошими, хотя вам также может понадобиться отправить по фактическому используемому типу данных, а также по измерениям, если это многомерный массив, так как вы не сможете сказать, что это просто из данных.

С другой стороны, то, как читать данные, немного зависит от языка. В большинстве языков есть способ адресации такого блока памяти как определенный тип массива. Например, в C вы могли бы просто base64-декодировать строку, присвоить ее (в случае вашего примера) float64 * и индексировать. Это не дает вам никаких встроенных средств защиты и функций, а также других операций, которые есть у numpy-массивов в Python, но это потому, что C в этом отношении совсем другой язык.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...