簡體   English   中英

從 3D numpy 數組創建 3D 圖

[英]Creating a 3D plot from a 3D numpy array

好的,所以我覺得應該有一種簡單的方法來使用 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')

關於如何更有效地完成這項工作的任何建議? 任何想法將不勝感激。

如果您有這樣的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")

給予

演示 3d 圖像

如果你想避免使用nonzero選項(例如,如果你有一個 3D numpy 數組,它的值應該是數據點的顏色值),你可以做你所做的,但通過使用保存一些代碼行ndenumerate

你的例子可能會變成:

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

我想重點只是您不需要嵌套 for 循環來遍歷多維 numpy 數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM