python - 如何从 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 之外的任何东西。
解决方案
编辑:仅删除周围的括号,请阅读Bill 的出色回答。
您可以使用np.all
andnp.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 阵列。
推荐阅读
- dns - 托管中的 Webmail,将网站重定向到另一个 IP (VPS)
- maxima - 极大值求解方程
- android - 如何在图库中显示保存到手机中的图像?
- sql - 编写查询以显示最近 3 次低薪?
- xamarin - 将 Xamarin.android 应用程序移植到 xamarin.ios
- python - jupyter notebook 上没有名为 object_detection 的模块
- javascript - 循环需要帮助
- php - 一次付款减少两个票据总数
- python-3.x - 如何恢复蜘蛛,有能力在它停止的地方重新启动。使用网络抓取和 python
- android - 在 API 级别 28 中不推荐使用 activeNetworkInfo.type