matplotlib ValueError:x和y必须具有相同的第一维度,但形状为(10000,)和(1,10000)

oalqel3c  于 2023-01-31  发布在  其他
关注(0)|答案(1)|浏览(162)

我试图写一个代码,我做了一个函数的两个变量,E和n,其中n是0 - 5的范围内的总和,并绘制的结果,这应该是一个多步函数。

import matplotlib.pyplot as plt
import numpy as np
 
E = np.linspace(0, 10, 10000)

for n in range(0, 6):
    h= []
    h.append(1/(1 + np.exp(-2*np.pi * (E-(n-0.5)*3))))    
    print(h)
    

plt.plot(E,h)

这是我一直在使用的代码,它为h生成多个数组:

[array([0.99991931, 0.99991981, 0.99992031, ..., 1.        , 1.        ,
       1.        ])]
[array([8.06930057e-05, 8.12016207e-05, 8.17134412e-05, ...,
       1.00000000e+00, 1.00000000e+00, 1.00000000e+00])]
[array([5.25548518e-13, 5.28861364e-13, 5.32195094e-13, ...,
       1.00000000e+00, 1.00000000e+00, 1.00000000e+00])]
[array([3.42258854e-21, 3.44416317e-21, 3.46587379e-21, ...,
       9.99999847e-01, 9.99999848e-01, 9.99999849e-01])]
[array([2.22893072e-29, 2.24298100e-29, 2.25711985e-29, ...,
       4.09276641e-02, 4.11750329e-02, 4.14238322e-02])]
[array([1.45157155e-37, 1.46072167e-37, 1.46992947e-37, ...,
       2.77912110e-10, 2.79663956e-10, 2.81426846e-10])]

但当我试图绘图时,我得到了以下错误:
ValueError:x和y必须具有相同的第一维度,但形状为(10000,)和(1,10000)
我不明白是什么原因造成的,任何帮助将不胜感激。

x3naxklr

x3naxklr1#

我猜你想要的是以下内容:

E = np.expand_dims(np.linspace(0, 10, 10000), 1)
n = np.arange(0, 6)

h = 1/(1 + np.exp(-2*np.pi * (E-(n-0.5)*3)))

plt.plot(E, h)

请注意,此矢量化计算不需要循环,因为Numpy broadcasting会自动计算出如何将En矢量组合为2D h数组(如果输入维度一致(注意np.expand_dims)一般来说,当您发现需要在Numpy中使用循环时,最好退一步考虑矢量化。
原始代码的修复版本:

import matplotlib.pyplot as plt
import numpy as np
 
E = np.linspace(0, 10, 10000)

h= []
for n in range(0, 6):
    h.append(1/(1 + np.exp(-2*np.pi * (E-(n-0.5)*3))).T)

    
plt.plot(E, np.stack(h).T)
  • 在循环之前定义h,这样它就不会在每次迭代时被定义为空列表。
  • 使用np.stack和转置(.T)将1D阵列列表合并为6x10_000 2D阵列,以绘制所有曲线。

相关问题