从3D numpy数组创建3D绘图

pte*_*ter 18 python numpy matplotlib

好的,所以我觉得应该有一种简单的方法来使用matplotlib创建一个三维散点图.我有一个dset带有0的3D numpy数组(),我不想要一个点和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')
Run Code Online (Sandbox Code Playgroud)

有关如何更有效地完成此任务的任何建议?任何想法将不胜感激.

DSM*_*DSM 24

如果你有dset这样的,并且你想获得1值,你可以使用nonzero,它"返回一个数组元组,每个维度一个a,包含该维度中非零元素的索引.".

例如,我们可以制作一个简单的3d数组:

>>> 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]]])
Run Code Online (Sandbox Code Playgroud)

并找到非零元素所在的位置:

>>> 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()
Run Code Online (Sandbox Code Playgroud)

如果我们想要一个更复杂的剪切,我们可以做类似的(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")
Run Code Online (Sandbox Code Playgroud)

给

演示3d图像