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
我试过的
np.vectorize(crop)(sequence_of_images)
导致此错误:numpy.AxisError: axis 1 is out of bounds for array of dimension 0
np.apply_along_axis(crop, 0, sequence_of_images)
导致此错误:numpy.AxisError: axis 1 is out of bounds for array of dimension 1
如何在不使用循环的情况下让它工作?
(可以假设对于时间维度上的每个图像,裁剪后的大小将相等,尽管图像裁剪掩码不相同)
对于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())
我有一个裁剪方法,适用于 (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
我试过的
np.vectorize(crop)(sequence_of_images)
导致此错误:numpy.AxisError: axis 1 is out of bounds for array of dimension 0
np.apply_along_axis(crop, 0, sequence_of_images)
导致此错误:numpy.AxisError: axis 1 is out of bounds for array of dimension 1
如何在不使用循环的情况下让它工作? (可以假设对于时间维度上的每个图像,裁剪后的大小将相等,尽管图像裁剪掩码不相同)
对于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())