代码之家  ›  专栏  ›  技术社区  ›  Minsky

对于具有Dask阵列和/或h5py的环路

  •  1
  • Minsky  · 技术社区  · 6 年前

    我有一个超过一亿行数据的时间序列。我正试图重塑它,以包括一个时间窗口。我的示例数据是形状(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))
    

    任何明智的想法都值得赞赏。

    1 回复  |  直到 6 年前
        1
  •  2
  •   chrisb    6 年前

    这并不一定能解决dask问题,但作为一种更快的替代方案 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 需要非常小心地使用-这是一种“高级”功能,不正确的参数很容易导致出现分段故障-请参阅 docstring