从索引列表中结合切片进行numpy索引

2024-04-20 01:17:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个大小为(d1、d2、d3、d4)的四维数组和一个包含k项的索引列表。索引列表的每个元素有3个元素。第一个是数组第一维的索引。第二个和第三个对应于第三个和第四个维度的切片开始,其中切片长度是一个固定数n。从数组的第二维开始,我总是想要所有元素。 最后,我想要一个大小为(k,d3,n,n)的新数组。出于性能原因,我希望在不使用For循环的情况下执行此操作,如果可能的话,还希望不使用数据复制。 以下解决方案可行,但使用for循环并复制数据:

d1,d2,d3,d4 = 3,4,10,10
data = np.arange(d1*d2*d3*d4).reshape((d1,d2,d3,d4))
idcs_all = [[0,4,6],
        [2,2,5]]
n = 3
k=len(idcs_all)
sub = np.zeros((k,d2,n,n))

for i, idcs in enumerate(idcs_all):
    sub[i] = data[idcs[0],:, idcs[1]:idcs[1]+n, idcs[2]:idcs[2]+n]

有没有一种方法可以对花式索引进行同样的操作


Tags: 数据元素列表fordatanp切片数组
1条回答
网友
1楼 · 发布于 2024-04-20 01:17:33

我们可以利用基于^{}^{}来获得滑动窗口More info on use of ^{} based ^{}。然后,使用来自idcs_all的索引,通过高级索引将这些窗口编入索引,我们就可以解决这个问题了

from skimage.util import view_as_windows

w = view_as_windows(data,(1,1,n,n))[...,0,0,:,:]
idcs_all = np.asarray(idcs_all)
sub = w[idcs_all[:,0],:,idcs_all[:,1],idcs_all[:,2]]

相关问题 更多 >