动作
尝试从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'
答案 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)
另请注意,我们在此处构建文件名称,但您可能希望通过执行listdir
或glob
来获取这些文件的名称。