создать большой xarray на основе dask из итератора векторов строк - PullRequest
0 голосов
/ 15 мая 2018

Как я могу построить xarray из итератора векторов строк.Полученный массив может быть больше памяти и будет поддерживаться массивом dask.Векторы строк также поставляются с уникальными метками, которые должны стать индексом строки получающегося xarray.В документах я вижу только конструктор, который для начала берет массив numpy в памяти.

Примером использования может быть сохранение модели встраивания слов в качестве xarray со словами в виде строки.этикетки.Эти модели обычно предоставляют итератор, который создает пары (строка, вектор) для всех слов в словаре.Большинство моделей имеют размеры в 100 с, и в словаре обычно содержится ~ 10 ^ 6 слов.Я хотел бы сложить векторы в матрицу для выполнения операций линейной алгебры, а также иметь возможность искать строки по слову string.

Я ожидал бы, что смогу написать что-то вроде:

import numpy as np
import xarray as xr

vectors = (('V'+str(i), np.random.randn(10000)) for i in range(10**9))
xray = xarray_from_iter(vectors)
xray.to_parquet('big_xarray.parquet')
row1234567 = xray['V1234567']

Предоставляет ли xarray что-то вроде xarray_from_iter?Если нет, то как мне это написать?xarray_from_iter должен работать примерно так же, как numpy.fromiter, за исключением того, что он также должен помечать строки как естьТакже потребуется отложить вычисления до вызова дампа, поскольку вся проблема заключается в том, что этот массив больше памяти.

1 Ответ

0 голосов
/ 22 мая 2018

TLDR; xarray не имеет конструктора from итератора. Вы должны будете сами строить свои dask массивы.

Кроме того, xarray не имеет метода to_parquet, поэтому вы не можете выполнять эту операцию (на данный момент).

Вот пример того, как вы можете создать массив dask (и xarray.DataArray) для вашего варианта использования:

import dask.array
import xarray as xr
import numpy as np

num = 10

names = []
arrays = []
for i in range(num):
    names.append('V'+str(i))
    arrays.append(dask.array.random.random(10000, chunks=(1000,)))

da = xr.DataArray(data, dims=('model', 'sample'), coords={'model': names})

print(da)

Уступая:

<xarray.DataArray 'stack-ff07239b7ea24834ba59f2d05b7f41e2' (model: 10, 
sample: 10000)>
dask.array<shape=(10, 10000), dtype=float64, chunksize=(1, 1000)>
Coordinates:
  * model    (model) <U2 'V0' 'V1' 'V2' 'V3' 'V4' 'V5' 'V6' 'V7' 'V8' 'V9'
Dimensions without coordinates: sample

Это вряд ли будет эффективным, особенно когда длина итератора становится большой (как в вашем примере). Возможно, стоит предложить такой конструктор на странице вопросов dask github.

...