沿带间隙的轴对 3 维 numpy.ndarray 进行切片

Slicing of 3-dimensional numpy.ndarray along one axis with gaps

我有一个视频序列,保存在 3 维 numpy 数组中。

import numpy as np
noise_50 = np.ones((422, 480, 640), dtype=np.float)

我想删除帧 0:25、231:272、372:421 并保留帧 26:231 和 273:371。

是否可以在一次操作中处理 slice 个对象?

我看过问题 Python: shorter syntax for slices with gaps? 但它只考虑一维数组。

如果我按照那里的建议尝试 s_ 索引技巧,它会将第二个切片广播到下一个轴并裁剪帧

retain = np.s_[26:230, 273:371]
n_50 = noise_50[retain]
n_50.shape

>>> (204, 98, 640)
     ^^^  ^^ - should be 303, 480

我也无法创建切片总和

retain = slice(26, 230) + slice(273, 371)

> TypeError: unsupported operand type(s) for +: 'slice' and 'slice'

嘿,有一种方法可以在一次操作中完成。 Numpy 允许您将 list/array 索引传递给切片的维度。所以你需要做的就是加入一些你想要保留的范围并将其传递到第一个 dim 中。就像下面输出 New shape (303, 480, 640)

的示例一样
import numpy as np

def mslice(data, ranges):
    d = np.concatenate([np.arange(*r, step=1) for r in ranges])
    return data[d, :, :]

# some dummy frame data
frames = np.zeros((422, 480, 640))
keep = mslice(frames, [(26, 231), (273, 371)])

print('New shape', keep.shape)