【问题标题】:Slicing of 3-dimensional numpy.ndarray along one axis with gaps沿一个轴对 3 维 numpy.ndarray 进行切片,并带有间隙
【发布时间】:2021-10-08 08:51:31
【问题描述】:

我有一个视频序列,保存在 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'

【问题讨论】:

标签: python numpy-slicing


【解决方案1】:

嘿,有一种方法可以在一次操作中完成。 Numpy 允许您将索引列表/数组传递给切片的维度。所以你需要做的就是加入一些你想要保留的范围并将其传递到第一个暗淡中。就像下面的例子一样,输出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)

【讨论】:

    猜你喜欢
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 2019-09-18
    • 2011-07-10
    • 2012-11-30
    • 2021-09-01
    • 1970-01-01
    相关资源
    最近更新 更多