非统一步幅的 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])是副本。
我有 N 个元素的一维数组。
我需要根据不统一但在辅助列表中指定的步幅在此数组上创建一个 PxR 视图(其中 PxR 示例 综合列表是一种选择。 我的代码: 但是,由于 L、R 和 aux 对我来说很大,我在想是否有一个 numpy 函数可以更有效地完成这项工作。 我正在探索 numpy.lib.stride_tricks.as_strided 作为一种选择。这会很棒,因为它还使我能够减少内存占用。但似乎 as_stride 只适用于不断进步.... 有什么建议可以解决我的问题吗?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]
对于列表,那种列表理解是唯一的选择。
但是如果我们从数组开始:
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])是副本。