从行向量的迭代器构造一个大型的dask支持的xarray

时间:2018-05-15 06:57:07

标签: python dask python-xarray xarray

如何从行向量的迭代器构建xarray。 生成的数组可能比内存大,并且将由dask数组支持。 行向量还带有唯一标签,这些标签需要成为生成的xarray的行索引。 在文档中,我只看到一个构造函数,它以内存中的numpy数组开头。

一个示例用例是将word embedding model存储为xarray,其中单词作为行标签。这些模型通常提供一个迭代器,它在词汇表中的所有单词上生成(字符串,矢量)对。大多数模型都有100个维度,词汇表中通常有大约10 ^ 6个单词。我想将矢量堆叠成矩阵以执行线性代数运算,并且还能够通过单词字符串查找行。

我希望能够写出类似的内容:

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那样工作 除了它还应该按行标记行。 它还需要延迟计算,直到调用dump, 因为整个问题是该数组大于内存。

1 个答案:

答案 0 :(得分:1)

TLDR; xarray没有来自迭代器的构造函数。你必须自己构建你的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问题页面上提出这样的构造函数。