

ランダムに作り出した点を3次元にプロットしようとしたらエラーを吐き出し、解決できません。  
以下がコードです。

[code]

    xs=[]
    ys=[]
    zs=[]
    
    for _ in range(3):
       
        x=np.random.randn(1)
        y=np.random.randn(1)
        z=np.random.randn(1)
        
        xs.append(x)
        ys.append(y)
        zs.append(z)
        
    import matplotlib.pyplot as plt
    from mpl_toolkits.mplot3d import Axes3D
    fig=plt.figure()
    ax=Axes3D(fig)
    ax.plot(xs, ys, zs, "o", color="red", ms=4, mew=0.5)
    
    ax.set_xlabel('x')
    ax.set_ylabel('y')
    ax.set_zlabel('z')
    
    plt.show()
    xs,ys,zs
    
[/code]

次にエラー内容です。

[code]

    ValueError                                Traceback (most recent call last)
    <ipython-input-8-3315fc4fb28c> in <module>
         23 fig=plt.figure()
         24 ax=Axes3D(fig)
    ---> 25 ax.plot(xs, ys, zs, "o", color="red", ms=4, mew=0.5)
         26 
         27 ax.set_xlabel('x')
    
    ValueError: input operand has more dimensions than allowed by the axis remapping
    
[/code]


CC BY-SA 4.0
2020-10-30T05:09:34.090
71610
2020-10-30T10:57:59.247
2020-10-30T05:11:40.100
26370
42540
question
python matplotlib
3次元でプロットができない


質問記事のソースと類似の内容を記述している記事が以下にあり、そちらは正常に動作します。  
[【Matplotlib】3D散布図の作成](https://algorithm.joho.info/programming/python/matplotlib-
scatter-plot-3d/)

何が違うかというと、それぞれのデータ作成部分が違うわけです。

確認するには、それぞれのプログラムをスクリプトファイルにしてPythonで実行するのでは無く、Pythonインタプリタを立ち上げて、それぞれのプログラムソースをコピペ実行すると、質問のプログラムはエラーが発生しますがそのために使ったデータは残っていて、内容を調べることが出来ます。

* * *

質問記事のソースでは、最後の xs,ys,zs
の表示結果を見ると、それぞれが1個だけの要素を持つnumpy.ndarrayのリストが、通常のPythonのリストの中に3つ並んでいる。いわばハイブリッドな[3][1]の2次元配列になっています。(内容は見易いように編集してあります)

[code]

    ([array([0.37819465]), array([1.18331264]), array([0.30752097])],
     [array([1.04432989]), array([1.86562421]), array([1.20300503])],
     [array([0.00736387]), array([-0.05291031]), array([0.24431243])])
    
[/code]

対して動作する方のソースでは、同様にデータを x,y,z
で表示させると、それぞれは100個の要素を持つ1次元のnumpy.ndarrayのリストになっています。

[code]

    (array([-1.20776617,  0.0755103 ,  0.29309606,  0.81499591, -0.04779708,
           -0.22722229,  0.1407896 ,  1.52444428, -1.1203402 ,  0.30589895,
           途中省略
            1.124391  , -0.49878404,  1.13699793,  0.06535393,  0.3135273 ]),
     array([-0.23766362,  0.34777034,  0.37287076,  1.27270215, -0.03464486,
            1.17946645,  0.88012189, -0.87574693, -1.3405201 ,  0.21947388,
           途中省略
           -0.72929008, -1.47974863,  1.8906365 ,  0.27601246, -0.81644342]),
     array([-0.0088914 , -0.96830462, -0.80176708,  0.14194074,  1.48899668,
           -0.49330629,  0.32355049, -0.57031329,  1.12166974,  0.90732565,
           途中省略
            0.3123933 ,  0.0106583 ,  0.39350928, -1.65329012,  0.76048113]))
    
[/code]

* * *

修正方法の1つは、Pythonリストの初期化とか`for`ループを使わず、動作する方の記事のように直接1次元のnumpy.ndarrayのリストを作ってしまうことです。  
該当部分のソースは以下の3行にまとめられます。

[code]

    xs=np.random.randn(3)
    ys=np.random.randn(3)
    zs=np.random.randn(3)
    
[/code]

結果はこうなります。

[code]

    (array([-0.51921527, -1.51555862,  2.63425821]),
     array([-0.63553749,  1.39414176,  0.70619291]),
     array([-0.24555452, -1.21405485, -2.22118169]))
    
[/code]

* * *

もう一つの修正方法は、`for`ループを残すとしたら、初期化とかappendで使うメソッドをnumpyのものに変えることです。  
ソースは以下のようになります。

[code]

    xs=np.empty(0)
    ys=np.empty(0)
    zs=np.empty(0)
    
    for _ in range(3):
       
        x=np.random.randn(1)
        y=np.random.randn(1)
        z=np.random.randn(1)
        
        xs=np.append(xs,x)
        ys=np.append(ys,y)
        zs=np.append(zs,z)
    
[/code]

作り方は違いますが、結果は上記と同様になります。

[code]

    (array([0.16575579, 0.12194223, 0.95687037]),
     array([-2.24153148,  0.11853497, -0.03863972]),
     array([ 0.14752166,  0.05863792, -1.40674958]))
    
[/code]

* * *


CC BY-SA 4.0
2020-10-30T10:57:59.247
71622
2020-10-30T10:57:59.247
26370
71610
answer