2

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

一个示例用例是将单词嵌入模型存储为 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 除了它还应该标记行。它还需要延迟计算直到调用转储,因为整个问题是该数组大于内存。

4

1 回答 1

1

TLDR;xarray 没有 from 迭代器构造函数。您必须自己构建 dask 阵列。

此外, xarray 没有to_parquet方法,因此(目前)不是您可以执行的操作。

这是一个示例,说明如何xarray.DataArray为您的用例构造一个 dask 数组(和):

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 问题页面上提出这样的构造函数可能是值得的。

于 2018-05-22T18:05:54.983 回答