带有 Dask 数组的循环 and/or h5py

For loops with Dask arrays and/or h5py

我有一个超过一亿行数据的时间序列。我正在尝试重塑它以包含时间 window。我的示例数据的形状为 (79499, 9),我正在尝试将其重塑为 (79979, 10, 9)。以下 for 循环在 numpy 中运行良好。

def munge(data, backprop_window):
    result = []
    for index in range(len(data) - backprop_window):
       result.append(data[index: index + backprop_window])
    return np.array(result)

X_train = munge(X_train, backprop_window)

我用 dask 尝试了一些变体,但它们似乎都挂了,没有给出任何错误消息,包括这个:

import h5py
import dask.array as da
f1 = h5py.File("data.hdf5")
X_train = f1.create_dataset('X_train',data = X_train, dtype='float32') 
x = da.from_array(X_train, chunks=(10000, d.shape[1]))
result = x.compute(munge(x, backprop_window))

任何明智的想法表示赞赏。

这不一定能解决您的问题,但作为 munge 的一种更快的替代方法,您可以改为使用 numpy 的 stride_tricks 创建数据的滚动视图(基于示例here)。

def munge_strides(data, backprop_window):
    """ take a rolling view into array by manipulating strides """
    from numpy.lib.stride_tricks import as_strided
    new_shape = (data.shape[0] - backprop_window,
                 backprop_window,
                 data.shape[1])
    new_strides = (data.strides[0], data.strides[0], data.strides[1])
    return as_strided(data, shape=new_shape, strides=new_strides)

X_train = np.arange(100).reshape(20, 5)

np.array_equal(munge(X_train, backprop_window=3),
               munge_strides(X_train, backprop_window=3))
Out[112]: True

as_strided 需要非常小心地使用 - 这是一个 'advanced' 功能,不正确的参数很容易导致你陷入段错误 - 请参阅 docstring