Dask 数组 from_npy_stack 缺少信息文件

Dask array from_npy_stack misses info file

动作

正在尝试从一堆 .npy 非 Dask 编写的文件中创建一个 Dask 数组。

问题

Dask from_npy_stack() 需要一个 info 文件,通常在使用 Dask 创建 .npy 堆栈时由 to_npy_stack() 函数创建。

尝试次数

我找到了这个 PR (https://github.com/dask/dask/pull/686),其中描述了如何创建信息文件

def to_npy_info(dirname, dtype, chunks, axis):
    with open(os.path.join(dirname, 'info'), 'wb') as f:
        pickle.dump({'chunks': chunks, 'dtype': x.dtype, 'axis': axis}, f)

问题

如何加载在 Dask 外部创建的 .npy 堆栈?

例子

from pathlib import Path
import numpy as np
import dask.array as da

data_dir = Path('/home/tom/data/')

for i in range(3):
    data = np.zeros((2,2))
    np.save(data_dir.joinpath('{}.npy'.format(i)), data)

data = da.from_npy_stack('/home/tom/data')

导致以下错误:

---------------------------------------------------------------------------
IOError                                   Traceback (most recent call last)
<ipython-input-94-54315c368240> in <module>()
      9     np.save(data_dir.joinpath('{}.npy'.format(i)), data)
     10 
---> 11 data = da.from_npy_stack('/home/tom/data/')

/home/tom/vue/env/local/lib/python2.7/site-packages/dask/array/core.pyc in from_npy_stack(dirname, mmap_mode)
   3722         Read data in memory map mode
   3723     """
-> 3724     with open(os.path.join(dirname, 'info'), 'rb') as f:
   3725         info = pickle.load(f)
   3726 

IOError: [Errno 2] No such file or directory: '/home/tom/data/info'

函数from_npy_stack短小精悍。同意它可能应该将元数据作为您这样的情况的可选参数,但是您可以在加载 "info" 文件后简单地使用代码行,假设您有正确的值。其中一些值,即 dtype 和每个数组的形状 chunks,大概可以通过查看第一个数据文件

来获得
name = 'from-npy-stack-%s' % dirname
keys = list(product([name], *[range(len(c)) for c in chunks]))
values = [(np.load, os.path.join(dirname, '%d.npy' % i), mmap_mode)
          for i in range(len(chunks[axis]))]
dsk = dict(zip(keys, values))

out = Array(dsk, name, chunks, dtype)

另请注意,我们正在此处构建文件的名称,但您可能希望通过执行 listdirglob.

来获取这些名称