我有一个3D的numpy数组,可以认为是一张图片(确切地说它是场点的值)。我想在所有维度上删除边框(0值,注意可能存在负值)。限制条件是每个分子的维度保持不变,例如,我只想删除边框,以便该维度中“最大”的条目仍在边框内。因此,整个数据集(小型,大小不是问题)需要考虑在内。
2D示例:
2D示例:
0 0 0 0 0
0 1 0 0 0
0 1 1 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 1 0
这里需要删除顶部行和最左侧以及最右侧的列。在整个数据集中,它们只包含0值。
处理后的结果如下:
1 0 0
1 1 0
0 0 0
0 0 0
0 0 0
0 1 0
0 0 1
0 0 1
由于我不是numpy专家,我在定义算法以满足我的需求时遇到了困难。我需要找到每个维度中不为0的最小和最大索引,然后使用它来裁剪数组。
类似于这个,但是在3D中,裁剪必须考虑整个数据集。
我该如何实现这个?
2019年2月13日更新:
所以我尝试了这里的3个答案(其中一个似乎已被删除,它使用zip),Martins和norok2s答案。输出维度相同,因此我假设它们都有效。
我选择Martins解决方案,因为我可以轻松提取边界框以将其应用于测试集。
2019年2月25日更新:
如果还有人关注这个问题,我想要进一步的输入。正如所说,这些实际上不是图像,而是“场值”,意味着浮点数而不是灰度图像(uint8),这意味着我至少需要使用float16,但这需要太多内存。(我有48GB可用,但即使对于50%的训练集也不够用)。
[1, 0, 1, 1]
,而较小的对象(缩小)是[1, 1]
,它应该变成[0, 0, 1, 1]
(末尾),[0, 1, 1, 0]
(中间)还是[1, 1, 0, 0]
(开头)? - norok2