首页 > 解决方案 > 如何从 3d 数组中删除周围的空数据

问题描述

我有一个形状为 (136, 512, 512) 的数组,该数组包含 0 和 1,表示该 3d 空间内的对象形状。我试图通过删除数组的空切片来减小数组的大小。本质上,我想将所有 1 保留在我的数组中,但删除不必要的行和列,同时保持我的数组为矩形,类似于 hitbox 或类似的东西。例如:

(0, 0, 0, 0, 0,

0, 0, 0, 1, 0,

0, 1, 1, 1, 0,

0, 1, 0, 1, 0,

1, 1, 0, 1, 0,

1, 0, 0, 1, 0,

0, 1, 1, 1, 0,

0, 0, 0, 0, 0)

会成为:

(0, 0, 0, 1,

0, 1, 1, 1,

0, 1, 0, 1,

1, 1, 0, 1,

1, 0, 0, 1,

0, 1, 1, 1)

但在 3d 尺度上

(对不起,可怕的格式,我在这方面很糟糕。)

这只是必要的,因为 pyplot 似乎无法用体素绘制如此大的 3d 图,或者至少在我的计算机上需要很长时间。因此,如果有人知道如何制作大型 3d 绘图,那就太好了。

编辑澄清一下,该示例只是一个 2d 示例,但要在 3d 中执行此操作,它必须考虑所有其他行/列,因为每个正方形必须具有相同的形状。不确定这是否有意义,很难在这么多维度上解释它。

把它想象成从立方体的中心移除每边最外面的 1 之外的任何东西。

标签: pythonnumpy

解决方案


编辑:仅删除周围的括号,请阅读Bill 的出色回答


您可以使用np.allandnp.delete来实现这一点。

import numpy as np

l = [[0, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 1, 1, 1, 0],
[0, 1, 0, 1, 0],
[1, 1, 0, 1, 0],
[1, 0, 0, 1, 0],
[0, 1, 1, 1, 0],
[0, 0, 0, 0, 0]]

arr = np.array(l)
arr1 = np.delete(arr, np.all(arr[..., :] == 0, axis=0), axis=1) # Deletes all 0-value columns
arr2 = np.delete(arr1, np.all(arr1[..., :] == 0, axis=1), axis=0) # Deletes all 0-value rows

print(arr)
print(arr2)

输出

[[0 0 0 0 0]
 [0 0 0 1 0]
 [0 1 1 1 0]
 [0 1 0 1 0]
 [1 1 0 1 0]
 [1 0 0 1 0]
 [0 1 1 1 0]
 [0 0 0 0 0]]
[[0 0 0 1]
 [0 1 1 1]
 [0 1 0 1]
 [1 1 0 1]
 [1 0 0 1]
 [0 1 1 1]]

同样也可以扩展到 3D 阵列。


推荐阅读