【发布时间】:2019-07-01 06:05:36
【问题描述】:
我有一个 3D numpy 数组。这可以被认为是一个图像(准确地说是场点的值)。我想删除所有维度的边框(0 值,注意可能有负值)。限制是所有分子的尺寸保持相同,例如。我只想删除边界,只要该维度中的“最大”条目仍在边界内。所以需要考虑整个数据集(小,大小不是问题)。
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 的最小和最大索引,然后使用它来修剪数组。
类似于this,但在 3D 中,裁剪必须考虑到整个数据集。
我怎样才能做到这一点?
2019 年 2 月 13 日更新:
所以我在这里尝试了 3 个答案(一个似乎已被删除的使用 zip 的答案),Martins 和 norok2s 的答案。输出尺寸是相同的,所以我假设它们都有效。
我选择 Martins 解决方案,因为我可以轻松提取边界框并将其应用于测试集。
2 月 25 日更新:
如果有人仍在观察这一点,我想进一步提供意见。如前所述,这些实际上不是图像,而是“字段值”,意思是浮点而不是灰度图像(uint8),这意味着我至少需要使用 float16,而这只是需要太多内存。 (我有 48gb 可用,但即使是 50% 的训练集也不够)。
【问题讨论】:
-
较小的数组相对于最大的数组应该放在哪里?我的意思是,在一维中,假设最大的对象是例如
[1, 0, 1, 1]和一个较小的(减少的)是[1, 1]应该变成[0, 0, 1, 1](结束)、[0, 1, 1, 0](中间)还是[1, 1, 0, 0](开始)? -
最初的一切都具有相同的大小。在最终结果中,每个剩余值/像素的“相对”坐标应保持不变。
-
@beginner_ 检查我的最新编辑。它现在一定能如你所愿地工作
-
@beginner_ 你的问题得到解答了吗?
-
@Martin 这里很忙。还没有机会验证哪个答案最有效
标签: python numpy image-processing multidimensional-array