【问题标题】:Numpy array indexing with partial indices带有部分索引的 Numpy 数组索引
【发布时间】:2014-06-04 05:44:16
【问题描述】:

我正在尝试提取 numpy 数组的特定切片,但不知道如何用索引元组来表达它。如果索引的长度与维数相同,则使用索引元组有效:

ind = (1,2,3)

# these two values are the same
foo[1,2,3] 
foo[ind]

但是如果我想在一个维度上得到一个切片,那么相同的符号就行不通了:

ind = (2,3)

# these two values are not the same
foo[:,2,3]
foo[:,ind]

# and this isn't even proper syntax
foo[:,*ind]

那么有没有办法将索引的命名元组与切片一起使用?

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    用于访问二维数组... 我相信你的建议应该有效。请注意,numpy 数组的索引从 0 开始。因此,要从以下矩阵中提取第一列和第三列,我使用列索引 0 和 2。

    import numpy as np
    foo = np.array([[1,2,3],[4,5,6],[7,8,9]])
    
    ind = (0,2)
    foo[:,ind]
    

    用于访问 3D 数组... 3D numpy 数组由 3 个值 x[i,j,k] 访问,其中“i”表示第一个矩阵切片,或

    [[ 0,  1,  2],
     [ 3,  4,  5],
     [ 6,  7,  8]]
    

    来自我下面的示例。 “j”表示第二个矩阵切片,或这些矩阵的行。而“k”代表他们的列。 i,j 和 k 可以是:、整数或元组。所以我们可以使用如下的两组命名元组来访问特定的切片。

    import numpy as np
    foo2 = np.array([[[ 0,  1,  2],
                   [ 3,  4,  5],
                   [ 6,  7,  8]],
    
                  [[ 9, 10, 11],
                   [12, 13, 14],
                   [15, 16, 17]],
    
                  [[18, 19, 20],
                   [21, 22, 23],
                   [24, 25, 26]]])
    
    ind1 = (1,2)
    ind2 = (0,1)
    
    foo2[:,ind1,ind2]
    

    【讨论】:

    • 这将得到第一列和第三列,但这不是我想要做的。如果我有一个 3D 数组,我会尝试在特定行和“管”处获取单列(或者您可以沿数组调用第 3 个方向)
    【解决方案2】:

    您可以显式创建slice 对象并将其添加到元组中,而不是使用: 语法:

    ind = (2, 3)
    s = slice(None) # equivalent to ':'
    foo[(s,) + ind] # add s to tuples
    

    与使用foo[:, ind] 相比,这样做的结果应该与foo[:,2,3] 相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-04
      • 2017-08-06
      • 2011-10-23
      • 2019-02-28
      • 1970-01-01
      • 2018-02-09
      相关资源
      最近更新 更多