代码之家  ›  专栏  ›  技术社区  ›  Tom Hemmes

堆栈中的DASK数组未命中信息文件

  •  1
  • Tom Hemmes  · 技术社区  · 6 年前

    行动

    试图从 .npy 不是由DASK写入的文件。

    问题

    达斯克 from_npy_stack() 期望 info 文件,通常由 to_npy_stack() 创建时的功能 NPY 与达斯克堆叠。

    尝试

    我找到了这个公关( 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)
    

    问题

    我该怎么装 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'
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   mdurant    6 年前

    功能 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)
    

    另外,请注意,我们正在这里构造文件的名称,但是您可能希望通过执行 listdir glob .