【问题标题】:Visualizing a 3d numpy array of 1's and 0's可视化 1 和 0 的 3d numpy 数组
【发布时间】:2017-06-29 12:33:42
【问题描述】:

好吧,伙计们,我有这个由 1 和 0 组成的 3d 数组,它应该代表一个 3d 对象。 0 表示那里什么都没有。 1 表示对象存在于该坐标中。我需要在我的屏幕上显示 3d 对象。对我来说,拥有一个离散的 3 维图,其值取决于颜色,这将是理想的。我尝试查看 glumpy 和 vispy,但文档页面现在似乎已关闭。

【问题讨论】:

  • 一个好的答案取决于您需要的可视化类型(切片、体积等)。在任何情况下,对于高级可视化,您都可以考虑:VTKMayaviPyQtGraphVispyGlumpy 可能已经有了某种体积视图,所以我会考虑两种可能性。除了那些检查Galry 是否也有类似的东西。
  • 只是一个额外的。 Blender 也可用于执行此操作。您可以在搅拌机本身内部使用 Python,包括 numpy。检查this question
  • “值取决于颜色”是什么意思?当然,该点是否出现在 3D 中取决于该值。你的意思是依赖索引?
  • 请参阅 this answer 了解您使用 matplotlib 的选项。
  • 问题已经解决了。

标签: python arrays numpy 3d


【解决方案1】:

我做了一个pull request to matplotlib that does exactly this,添加了ax3d.voxels函数。 很遗憾,它还没有经过全面审查。

更新:这使它成为 matplotlib 2.1

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# your real data here - some 3d boolean array
x, y, z = np.indices((10, 10, 10))
voxels = (x == y) | (y == z)

ax.voxels(voxels)

plt.show()

【讨论】:

  • 该死,那还要等吗?
  • 你总是可以在你自己的代码中包含这个函数,使用voxels(ax3d, ...)而不是ax3d.voxels
  • 伙计,我完全是 matplotlib 的菜鸟。您能否将我重定向到详细指南?
  • 使用该拉取请求中的功能的详细指南?只需从差异中复制并粘贴函数
  • 如果我不发送错误,我得到:文件“3d.py”,第 30 行,体素颜色 = next(self._get_patches_for_fill.prop_cycler)['color'] AttributeError: type object 'Axes3D ' 没有属性 '_get_patches_for_fill' 如果我发送颜色,我得到: self.xy_dataLim.update_from_data_xy(np.array([x, y]).T, not had_data) AttributeError: 'list' object has no attribute 'xy_dataLim'
【解决方案2】:

使用np.where 提取坐标,使用matplotlib 提取3D 图。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

data = np.zeros(shape=(20, 20, 20), dtype=np.bool_)
np.fill_diagonal(data, True)

fig = plt.figure()
Axes3D(fig).plot_wireframe(*np.nonzero(data))
plt.show()

这会根据线框出现在矩阵中的位置绘制基本的 3D 线框。您可能希望使用plot_surfacescatter 代替plot_wireframe。请参阅the documentation 了解更多信息。

【讨论】:

  • 我不必使用 numpy.where 因为我的数组已经只有 1 和 0。虽然它看起来大部分都在工作,你能推荐我更快的东西吗,这太滞后了。
  • np.where 需要很长时间吗?如果是这样的话,我会感到非常惊讶。然而,Matplotlib 是一堆垃圾,所以如果 3D 绘图的渲染速度很慢,我不会感到惊讶。您可能希望考虑在不弹出窗口的情况下渲染它并将图像保存为文件,但除此之外,恐怕我没有更好的建议。
  • 这不正确,是吗?它不只是按扫描线顺序在网格中的每个点上绘制一条线吗?在当前初始化后用data[8:12,8:12,8:12] = 1试试
  • 另外,我已经编辑了你的答案以使用布尔数组 - 随时恢复,但它似乎比在 cmets 中解释更容易
  • 你是对的@Eric,wireframe 没有做正确的事。 OP 的确切用例尚不清楚,我觉得这是最合适的,但当然不是一个完美的解决方案,因此我将scatterplot_surface 列为可能的替代方案。似乎您的 PR 中的解决方案是最好的解决方案。合并后,我将编辑此答案。
【解决方案3】:

您能否将每个“1”点的 x、y、z 坐标保存到文件中并用cloudcomparemeshlab 显示?

Cloudcompare 甚至可以让您在每个点之后存储其他值并选择如何将它们映射到颜色上

【讨论】:

    猜你喜欢
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    • 2019-09-11
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多