首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有非均匀步长的NumPy阵列视图

具有非均匀步长的NumPy阵列视图
EN

Stack Overflow用户
提问于 2022-05-06 16:07:10
回答 1查看 43关注 0票数 -1

我有N个元素的一维数组。我需要在这个数组上创建一个PxR视图(其中的PxR

示例

代码语言:javascript
运行
复制
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]]

综合清单是一种选择。

我的代码:

代码语言:javascript
运行
复制
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似乎只适用于不断的大步.

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-06 16:31:24

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

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

代码语言:javascript
运行
复制
In [298]: L=np.array([10,14,4,12,3,85,43,22,11,7,10])
     ...: R=3
     ...: aux=np.array([2,5,7])

我们可以使用以下内容创建索引数组:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
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)是副本。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72144475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档