【问题标题】:numpy fancy indexing from list of indices combined with slicesnumpy 花式索引从索引列表结合切片
【发布时间】:2020-02-07 09:58:14
【问题描述】:

我有一个大小为 (d1,d2,d3,d4) 的 4 维数组,以及一个包含 k 条目的索引列表。索引列表的每个元素都有 3 个元素。第一个是数组第一维的索引。第二个和第三个对应于第 3 和第 4 维的切片的开始,其中切片长度是固定数字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]

有没有办法对花哨的索引做同样的事情?

【问题讨论】:

  • @Logica 我们不应该过度使用标签。事实上,我可能会删除arrays 标签。

标签: python numpy


【解决方案1】:

我们可以利用基于np.lib.stride_tricks.as_stridedscikit-image's view_as_windows 来获得滑动窗口。 More info on use of as_strided based view_as_windows。然后,使用来自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]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-21
    • 1970-01-01
    • 1970-01-01
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    • 2017-07-03
    相关资源
    最近更新 更多