【问题标题】:Creating a 3D plot from a 3D numpy array从 3D numpy 数组创建 3D 图
【发布时间】:2012-09-13 20:53:10
【问题描述】:

好的,所以我觉得应该有一种简单的方法可以使用 matplotlib 创建 3 维散点图。我有一个 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')

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

【问题讨论】:

    标签: python numpy matplotlib


    【解决方案1】:

    如果您有类似的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]]])
    

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

    >>> 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")
    

    给予

    【讨论】:

    • 美丽。我有一个关于(d > 3.4).nonzero() 部分的问题,它会只返回 d 值大于 3.4 的地方吗?
    • @pter:完全正确。 (d > 3.4) 给出了一个与 d 形状相同的布尔数组,其中 True 条目 > 3.4 和 False 其他地方。
    • 甜蜜我不知道这个(通常不需要 3d 情节......但如果我这样做会很棒!)谢谢 DSM
    【解决方案2】:

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

    你的例子可能变成:

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

    我想重点是你不需要嵌套 for 循环来遍历多维 numpy 数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-14
      • 2021-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-31
      • 2013-08-17
      相关资源
      最近更新 更多