首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从3D numpy数组创建3D绘图

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

Stack Overflow用户
提问于 2012-09-14 04:53:10
回答 2查看 56.4K关注 0票数 25

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

代码语言:javascript
复制
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')

对于如何更有效地完成这项工作,有什么建议吗?任何想法都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-14 05:08:32

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

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

代码语言:javascript
复制
>>> 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]]])

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

代码语言:javascript
复制
>>> 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,并且计数为非零。

最后,我们绘制:

代码语言:javascript
复制
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")

给予

票数 31
EN

Stack Overflow用户

发布于 2019-11-16 09:59:35

如果您希望避免使用nonzero选项(例如,如果您有一个3Dnumpy数组,其值应为数据点的颜色值),您可以这样做,但可以使用ndenumerate保存一些代码行。

您的示例可能会变成:

代码语言:javascript
复制
for index, x in np.ndenumerate(dset):
    if x == 1:
        ax.scatter(*index, c = 'red')

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12414619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档