非统一步幅的 NumPy 数组视图

view of a NumPy array with non uniform stride

我有 N 个元素的一维数组。 我需要根据不统一但在辅助列表中指定的步幅在此数组上创建一个 PxR 视图(其中 PxR

示例

INPUTS:
L=[10,14,4,12,3,85,43,22,11,7,10]
R=3
aux=[2,5,7]

output= [[4,12,3],[85,43,22],[22,11,7]]

综合列表是一种选择。

我的代码:

output = [[L[a+p] for p in range(R)] for a in aux]

但是,由于 L、R 和 aux 对我来说很大,我在想是否有一个 numpy 函数可以更有效地完成这项工作。

我正在探索 numpy.lib.stride_tricks.as_strided 作为一种选择。这会很棒,因为它还使我能够减少内存占用。但似乎 as_stride 只适用于不断进步....

有什么建议可以解决我的问题吗?

对于列表,那种列表理解是唯一的选择。

但是如果我们从数组开始:

In [298]: L=np.array([10,14,4,12,3,85,43,22,11,7,10])
     ...: R=3
     ...: aux=np.array([2,5,7])

我们可以创建一个索引数组:

In [299]: idx = aux[:,None]+np.arange(R)
In [300]: idx
Out[300]: 
array([[2, 3, 4],
       [5, 6, 7],
       [7, 8, 9]])
In [301]: L[idx]
Out[301]: 
array([[ 4, 12,  3],
       [85, 43, 22],
       [22, 11,  7]])

编辑

使用更安全、更简单的版本如`as_strided:

In [323]: np.lib.stride_tricks.sliding_window_view(L,(3,))
Out[323]: 
array([[10, 14,  4],
       [14,  4, 12],
       [ 4, 12,  3],
       [12,  3, 85],
       [ 3, 85, 43],
       [85, 43, 22],
       [43, 22, 11],
       [22, 11,  7],
       [11,  7, 10]])
In [324]: np.lib.stride_tricks.sliding_window_view(L,(3,))[[2,5,7]]
Out[324]: 
array([[ 4, 12,  3],
       [85, 43, 22],
       [22, 11,  7]])

虽然 [323] 是 view,但子集(和 [301])是副本。