Numpy - 在时间维度上概括裁剪

Numpy - Generalize cropping over time dimension

我有一个裁剪方法,适用于 (N, M) 数组,我希望它适用于 (T, N, M) - 请参阅下面我尝试过但不起作用的方法(提示 - 不能无法 np.vectorize 工作)

这是方法

def crop(image: np.ndarray) -> np.ndarray:
    """
    Crop a single image
    """
    image_cropped = image[~np.all(image == 0, axis=1)]
    image_cropped = image_cropped[:, ~np.all(image_cropped == 0, axis=0)]

    return image_cropped

我试过的

如何在不使用循环的情况下让它工作? (可以假设对于时间维度上的每个图像,裁剪后的大小将相等,尽管图像裁剪掩码不相同)

对于2D image,链式索引可以用行和列的外掩码来复制。

因此,

m1 = ~np.all(image == 0, axis=1)
m2 =  ~np.all(image_cropped == 0, axis=0)

image_cropped = image[m1, :]
image_cropped = image_cropped[:, m2]

等同于:

image_cropped = image_cropped[outer_mask(m1, m2)]

我们会将这些知识转移到 3D 案例中。此外,3D 的外部掩码可以很容易地用 keepdims=True 的两个 mak 构造,用于 ALL 减少,最后使用负责外部操作的元素乘法。

因此,我们将得到:

mask_0s = image_nd == 0
mask1 = ~np.all(mask_0s, axis=2, keepdims=True)
mask2 = ~np.all(mask_0s, axis=1, keepdims=True)
out = image_nd[mask1 & mask2]

终于有了 3D 数组输出:

out = out.reshape(image_nd.shape[0],-1,mask2[0].sum())