26

わかりましたので、matplotlib を使用して 3 次元散布図を作成する簡単な方法があるはずです。私は3D numpy配列( dset)を持っていて、ポイントが必要ない場所には0があり、ポイントが必要な場所には1があります。基本的にそれをプロットするには、次のように3つの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')

これをより効率的に達成する方法について何か提案はありますか? どんなアイデアでも大歓迎です。

4

2 に答える 2

31

そのdsetようなものがあり、単に値を取得したい1場合は、 を使用できます。これは、「その次元の非ゼロ要素のインデックスを含む、 の nonzero各次元に 1 つずつ、配列のタプルを返します。」.a

たとえば、単純な 3 次元配列を作成できます。

>>> 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 であり、0 以外としてカウントされるため、次のようなことを行うこともできます。

最後に、次のようにプロットします。

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

与える

デモ 3 d イメージ

于 2012-09-13T21:08:31.783 に答える