定义新数组时出现值错误

2024-04-16 20:13:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我从事宇宙学研究,最近我有机会获得数值模拟方面的经验。你知道吗

我有C++的经验,但我刚刚开始使用Python。你知道吗

下面是我目前正在编写的python代码的一部分。你知道吗

def energy(s):
    def spectrum(s):
        phi = sol[s,:]
        N = len(phi)
        return 2.0 / N * np.real(np.fft.rfft(phi))
    delta_t = t_array[1] - t_array[0]
    sp = spectrum(s)
    spb = spectrum(s-1)
    spa = spectrum(s+1)
    L = len(sp)
    def spectrum_dot(s):
        sD = np.array([]).reshape(1,L)
        for j in range(0,L):
         sD[j] = (spa[j] - spb[j]) / (2 * delta_t)
        return sD
    sd = spectrum_dot(s)
    E = np.array([]).reshape(1,L)
    for i in range(0,L):
     E[i] = (sd[i]*sd[i]/2) + (sp[i]*sp[i]*(i*math.pi/128)*(i*math.pi/128)/2) + V(sp[i])
    return E

f_l = energy(time_steps * 128 / 619)
plt.plot(f_l[1:200])
plt.axhline(0,color='black',linewidth=0.6)
plt.axis([0,200,-1,1])
plt.savefig('128.png')

对于行“sD=np.数组([])。重塑(1,L)”,我得到一个ValueError,它说“ValueError:新数组的总大小必须保持不变”。你知道吗

定义“光谱点”的返回数组似乎是个问题。你知道吗

你能给我一个提示来纠正这个错误吗?你知道吗

谢谢你的阅读。你知道吗


Tags: lenreturndefnpplt数组经验sd
1条回答
网友
1楼 · 发布于 2024-04-16 20:13:27

代码中有两个问题,第一个问题是.reshape()方法不能更改数组的大小(或数组地址的数据),而只能更改该数据的形状

# legal
z1 = np.zeros(20) 
z1.reshape((4,5))
# illegal
z1.reshape((5,5))

另一个问题是fortran/c的背景,我也有,所以我可以理解你的问题。。。当您使用numpy时,您应该避免编写逐项修改数组的循环,而不是编写向量表达式,它的值是另一个数组,如果您为它指定了一个名称,您可以稍后重用它,返回到您的代码

sD = (sda-sdb)/2/delta_t

没有初始化sD,没有索引,没有显式循环,最重要的是,隐式循环的执行速度与编译语言相当,即比Python中的显式循环快几个数量级。你知道吗

处理数组表达式时numpy遵循的规则称为广播规则,如果您要认真使用这个库,您必须熟悉广播,它使您能够编写(有时有点神秘,即使在我们的示例中不是这样,表达式也可以避免显式循环的过载。你知道吗

相关问题 更多 >