从3D numpy数组创建3D打印

2024-04-26 21:20:06 发布

您现在位置:Python中文网/ 问答频道 /正文

好的,所以我觉得应该有一个简单的方法来创建一个三维散点图使用matplotlib。我有一个3D numpy数组(dset),其中0是我不想要的点,1是我想要的点,基本上要绘制它,现在我必须遍历三个for:循环:

for i in range(30):
    for x in range(60):
        for y in range(60):
            if dset[i, x, y] == 1:
                ax.scatter(x, y, -i, zdir='z', c= 'red')

有什么建议可以让我更有效地完成这个任务吗?任何想法都将不胜感激。


Tags: 方法innumpyforifmatplotlib绘制range
2条回答

如果您想避免使用nonzero选项(例如,如果您有一个3D numpy数组,该数组的值应该是数据点的颜色值),您可以执行您所做的操作,但可以使用ndenumerate保存一些代码行。

你的例子可能会变成:

for index, x in np.ndenumerate(dset):
    if x == 1:
        ax.scatter(*index, c = 'red')

我想关键是你不需要嵌套for循环来迭代多维numpy数组。

如果有这样的dset值,并且只想得到1值,那么可以使用nonzero,它“返回数组的元组,每个a维度一个,包含该维度中非零元素的索引。”。

例如,我们可以制作一个简单的三维阵列:

>>> import numpy
>>> numpy.random.seed(29)
>>> d = numpy.random.randint(0, 2, size=(3,3,3))
>>> d
array([[[1, 1, 0],
        [1, 0, 0],
        [0, 1, 1]],

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

       [[1, 1, 0],
        [0, 1, 0],
        [0, 0, 1]]])

找到非零元素的位置:

>>> d.nonzero()
(array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2]), array([0, 0, 1, 2, 2, 0, 0, 1, 2, 2, 0, 0, 1, 2]), array([0, 1, 0, 1, 2, 1, 2, 0, 1, 2, 0, 1, 1, 2]))
>>> z,x,y = d.nonzero()

如果我们想要更复杂的切割,我们可以做(d > 3.4).nonzero()之类的事情,因为True的整数值为1,并且计数为非零。

最后,我们将:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x, y, -z, zdir='z', c= 'red')
plt.savefig("demo.png")

给予

demo 3d image

相关问题 更多 >