我有一个由 512x1024 图像帧组成的 3D 数组(121、512、1024)。 图像的底部几行有 Nans,这扰乱了我的处理。我想删除这些并最终得到看起来像 (121, 495, 1024) 的东西。
我一直在尝试
的变体arr[:, ~np.isnan(arr).any(0)]
但我最终得到 (121, 508252)。
我也尝试过 arr[np.argwhere(~np.isnan(arr)]
但是我遇到了内存错误。
这似乎是一个简单而常见的任务,但我找到的所有示例都是针对二维数组的。任何帮助将不胜感激。
编辑:或者,如果我要重塑形状,我需要它自动检测新形状应该是什么。根据图像上的变换,修剪 Nan 可能会产生不同形状的数组(121、495、1000)或其他形状。但在一个图像堆栈中(例如 121 帧),所有图像都将具有相同的形状,因此制作数组是合法的。
问题是我无法预测纳米是否在一条直线上,在图像的顶部、侧面或底部(但应该是边缘)。我基本上必须对图像进行更多切割才能获得直行/列,我只需要找出新边缘应该在哪里。
arr = np.ones([121, 512, 1024])
arr[:,497:512,0:675] = np.nan
arr[:,496:512,676:1024] = np.nan
#try 3
trim = np.argwhere(~np.isnan(arr))
rows = np.unique(trim[:,1])
cols = np.unique(trim[:,2])
result_arr = arr[:, ~np.isnan(arr).all(0)]
result_arr.shape = -1, len(rows), len(cols)
例如,这不起作用,因为第 675 列处存在行不匹配,因此这些维度的单元格数量错误。
由于您想在第二个维度上进行过滤,因此您应该将第一个 和最后一个 维度与
any
: 聚合
out = arr[:, ~np.isnan(arr).any((0, 2))]
out.shape # (121, 496, 1024)