如何从行向量的迭代器构建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,
因为整个问题是该数组大于内存。
答案 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问题页面上提出这样的构造函数。