【问题标题】:tuple as index in multidimensional array together with slicing元组作为多维数组中的索引以及切片
【发布时间】:2021-04-21 02:41:51
【问题描述】:

我有一个3维数组A,我需要通过元组x=[1,1]访问A[:,1,1]。 像这样的:

x = [1,1]
A[:,*x]

但是,这样做会出现语法错误。我希望能够使用变量x 访问A[:,1,1] 的元素,我该怎么做?

谢谢!


第二个问题:

如何做同样的事情,而不是切片 : 用布尔数组来做。例如,如果t 是一个布尔数组,则获取A[t, *x]

【问题讨论】:

    标签: python numpy slice


    【解决方案1】:

    您可以执行以下操作:

    import numpy as np
    
    A = np.arange(12).reshape((2, 3, 2))
    print(A)
    
    x = [1, 1]
    print(A[(slice(None), *x)])
    

    您可以使用slice(None) 而不是: 来构建切片元组。元组环境允许使用 * 运算符进行值解包。

    输出:

    [[[ 0  1]
      [ 2  3]
      [ 4  5]]
    
     [[ 6  7]
      [ 8  9]
      [10 11]]]
    
    [3 9]
    

    验证是否匹配:

    import numpy as np
    
    A = np.arange(12).reshape((2, 3, 2))
    x = [1, 1]
    s = (slice(None), *x)
    print(np.allclose(A[s], A[:, 1, 1]))  # True
    

    *这是对此处找到的答案的修改:Slicing a numpy array along a dynamically specified axis


    编辑以反映对问题和评论的编辑:

    为了澄清,您可以在元组环境中解压缩您喜欢的任何可迭代对象。 * 操作符通常在元组中起作用。随心所欲地订购您的元素。混合不同的迭代、类型、slice(None),无论你想如何构建切片,只要你最终得到一个有效的值序列,它就会按预期运行。

    import numpy as np
    
    A = np.arange(12).reshape((2, 3, 2))
    t = [True, False]
    x = [1, 1]
    print(np.allclose(A[(*t, *x)], A[True, False, 1, 1]))  # True
    

    您也可以在元组中添加完整列表:

    print(np.allclose(A[(t, *x)], A[[True, False], 1, 1]))  # True
    

    【讨论】:

    • 谢谢!后续问题:如果不是切片 : 我有一个布尔数组作为第一个参数,你会怎么做?例如,如果我有 t = [False, True] 并且我想要 A[t, *x]
    • 答案已更新以包含此内容。
    【解决方案2】:

    你可以用slice(None)代替:,所以

    y = tuple([slice[None]] + x)
    A[y]
    

    是你需要的。

    【讨论】:

    • 因为我希望它更通用。我正在编写一个灵活的程序,它很可能具有超过三个维度的A,因此x 也将具有更多维度
    猜你喜欢
    • 2019-05-09
    • 2012-08-29
    • 2015-10-23
    • 1970-01-01
    • 2015-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    相关资源
    最近更新 更多