【问题标题】:Numpy sclicing multiple dimensions simulteanouslyNumpy同时切片多个维度
【发布时间】:2018-01-31 13:11:42
【问题描述】:

给定一个二维数组和两对索引,分别定义一个子矩阵的左上角和右下角:

a = np.arange(25).reshape(5,5)
# 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]])
ij_ul = (1, 1)  # upper left
ij_lr = (4, 3)  # lower right

我可以通过以下方式获得子矩阵:

a[ij_ul[0]:ij_lr[0], ij_ul [1]: ij_lr[1]]
# array([[ 6,  7],
#        [11, 12],
#        [16, 17]])

但是我想使用更优雅的东西:

a[ij_ul:ij_lr]  # Wish
# TypeError: slice indices must be integers or None or have an __index__ method

同时对所有维度进行切片。 ij_ul 中的第一个索引,切片到 ij_lr 中的第一个索引,第二个到第二个。

我想将它用于应该适用于 2D 和 3D 的功能。 这里这样的公式会更通用,因为不需要计算维度和调整切片:

a[i:j]  # 1D
a[i:j, k:l]  # 2D
a[i:j, k:l, n:m]  # 3D
a[tuple_1:tuple_2]  # Wish

如果数组和两个索引元组是,最后一行将始终有效 的匹配维度。

有没有类似在 python/numpy 中同时切片多个维度的东西?

【问题讨论】:

    标签: python numpy numpy-slicing


    【解决方案1】:

    给定这两个列表,我们可以如下构造一个元组:

    our_submatrix = a[tuple(map(slice, ij_ul, ij_lr))]
    

    这里我们同时迭代ij_ulij_lr这两个可迭代对象,并构造slice(..)对象(如果你写i:j你实际上是在幕后构造这样的对象)。

    所以我们在这里做的是构造一个切片元组,我们可以将它传递给a 以构造一个具有指定切片的视图。

    例如:

    >>> A = np.random.randn(5, 7)
    >>> A
    array([[-0.41526531,  0.88895983,  1.25061578, -0.01930474,  0.90183725,
             0.169831  , -0.67271614],
           [ 0.26148559, -1.24269541,  0.72472787, -2.75687495, -0.64511098,
            -1.5535446 ,  0.74714421],
           [ 0.8423359 ,  0.26620621,  0.26581058, -1.20667371,  0.60521744,
             2.02856815, -0.43339106],
           [ 0.29617257,  1.86195973, -1.33591589,  0.97233933, -0.69254736,
            -0.31652783,  0.78613453],
           [-0.93928881,  0.26735583, -0.27057705,  0.78084479, -0.76763169,
             0.12574734, -1.88236193]])
    >>> A[tuple(map(slice, ij_ul, ij_lr))]
    array([[-1.24269541,  0.72472787],
           [ 0.26620621,  0.26581058],
           [ 1.86195973, -1.33591589]])
    

    【讨论】:

      猜你喜欢
      • 2021-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-29
      • 2016-04-11
      • 2019-04-11
      • 1970-01-01
      相关资源
      最近更新 更多