如何高效地从NumPy数组中访问多个切片?

3

目前我正在按以下方式访问多个切片:

首先,我分配一个数组,该数组将被多次重新分配

X = np.zeros( (batch_size, window, 5) )

这是将被多次执行的分配循环(batch_indices每次具有不同的索引,但相同的形状):
for i, b in enumerate(batch_indices):
    X[i] = Xs[b:b+window]

有更高效的方法吗?我感觉应该有类似于以下语法:

X = Xs[ [slice(b,b+window) for b in batch_indices] ]

尽管Xs的形状是二维的,但X的最终形状应该是一个三维的np.array。可以这样理解:Xs是一个长的多维时间序列,而X需要是一个包含多个多维时间序列切片的numpy数组。


你有查看过 numpy 迭代器 吗? - Francesco Montesano
你尝试过布尔索引吗?值得进行性能检查... - Raf
发布的解决方案对您有用吗? - Divakar
1个回答

2

方法一

一种向量化的方法是创建所有这些滑动窗口索引,并使用这些索引访问Xs。示例如下:

X = Xs[np.asarray(batch_indices)[:,None] + np.arange(window)]

方法二

另一种内存高效的方法是使用np.lib.stride_tricks.as_strided创建滑动窗口,从而避免像前面的方法那样创建滑动窗口索引,并简单地使用batch_indices进行索引,如下所示 -

X = strided_axis0(Xs,window)[np.asarray(batch_indices)]

基于步幅的函数 strided_axis0 来自这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接