【问题标题】:Numpy slice of arbitrary dimensions任意尺寸的 Numpy 切片
【发布时间】:2023-03-07 08:50:01
【问题描述】:

我想对一个 numpy 数组进行切片以获得最后一维中的第 i 个索引。对于 3D 数组,这将是:

slice = myarray[:,:,i]

但我正在编写一个函数,我可以在其中获取任意维度的数组,因此对于 4D 数组,我需要myarray[:,:,:,i],依此类推。有没有一种方法可以为任何数组获取此切片,而无需显式编写数组维度?

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    ...Ellipsis,正是这样做的:

    slice = myarray[..., i]
    

    Ellipsis 是 python 对象,如果你想在方括号符号之外使用它。

    【讨论】:

    • 谢谢,我不知道这个。我自己的答案允许更通用的切片,但你的真的很酷。
    • @tiago 事实上,你总是可以构建一个切片元组。 >你也可以在那里使用Ellipsis...
    • 在任何地方都找不到这个答案,很惊讶它不在多维数组的官方 python 部分中。非常感谢!
    【解决方案2】:

    其实,刚刚找到了答案。正如numpy's documentation 中所述,这可以通过切片对象来完成。在我的特殊情况下,可以这样做:

    idx = [slice(None)] * (myarray.ndim - 1) + [i] 
    my_slice = myarray[idx]
    

    slice(None)相当于选择该索引中的所有元素,最后一个[i]选择最后一个维度的特定索引。

    【讨论】:

    • 我正要建议这个,但实际上塞巴斯蒂安的方法要优雅得多!另外,我认为您的代码实际上不起作用,您将列表与元组相乘,然后连接没有slice() 对象的裸索引。也许你的意思是[slice(None)] * myarray.shape[-1] + [slice(None,i)]
    • @NiklasB。最后一个[i]是正确的,但如果不使用Ellipsis,则第一部分必须是(myarray.ndim - 1)作为乘数。
    • @Sebastian,你说得对,我用一个数字测试过,然后忘了放 len(myarray.shape[:-1])。我刚刚根据您的建议修复了它。
    • 我喜欢这个答案,但我不喜欢切片对象立即被覆盖
    • 我真的很感激这一点,因为 pscript 还不支持省略号(奇怪的是,因为 JS 支持......)。所以,是的,我真的很感谢你们花时间制作和改进这个替代分析器(
    【解决方案3】:

    在切片任意维度方面,之前的优秀答案可以扩展到:

    indx = [slice(None)]*myarray.ndim
    indx[slice_dim] = i
    sliced = myarray[indx]
    

    这将返回来自任何维度的切片 slice_dim - slice_dim = -1 再现了之前的答案。 为完整起见 - 上述清单的前两行可以简化为:

    indx = [slice(None)]*(slice_dim) + [i] + [slice(None)]*(myarray.ndim-slice_dim-1)
    

    虽然我发现以前的版本更具可读性。

    【讨论】:

    • 很好的解决方案,只知道从今天起在 Numpy 1.18.1 上,[Ellipsis] 部分需要更改为 [slice(None)],否则会出现“IndexError: an index can only have a single ellipsis” ('...')" 被提出。
    • 这个答案很好,除了它将切片数组分配给内置 slice - 我建议重命名该变量以避免问题。
    猜你喜欢
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    相关资源
    最近更新 更多