我有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似乎只适用于不断的大步.
有什么建议可以解决我的问题吗?
发布于 2022-05-06 16:31:24
对于列表,这种列表理解是唯一的选择。
但是如果我们从数组开始:
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)是副本。
https://stackoverflow.com/questions/72144475
复制相似问题