来自npy_stack的Dask数组错过了info文件

时间:2018-05-31 12:47:09

标签: numpy dask

动作

尝试从Dask写的.npy文件堆栈中创建一个Dask数组。

问题

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

尝试

我找到了这个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'

1 个答案:

答案 0 :(得分:2)

函数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来获取这些文件的名称。