从 3D 数组中删除 Nans 而不重塑我的数据

问题描述 投票:0回答:1

我有一个由 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 列处存在行不匹配,因此这些维度的单元格数量错误。

python indexing nan numpy-ndarray numpy-slicing
1个回答
0
投票

由于您想在第二个维度上进行过滤,因此您应该将第一个 和最后一个 维度与

any
:

聚合
out = arr[:, ~np.isnan(arr).any((0, 2))]

out.shape # (121, 496, 1024)
© www.soinside.com 2019 - 2024. All rights reserved.