TypeError:'numpy.float64'对象不支持项目分配-类似的代码,错误引发

时间:2019-07-04 08:05:59

标签: python numpy error-handling typeerror

我正在编写分子动力学代码,为此,我有一个函数可以计算粒子之间的力:保守力,随机力和耗散力。保守力是成对的力,这意味着我有一个双循环来计算它们。我想节省一些时间,并在双循环的其中一个循环中包括随机力和耗散力的计算,如下所示:

fr = np.zeros((npart, dim))
fd = np.zeros((npart, dim))
fc = np.zeros((npart, dim))

for i in range(npart-1):

    for d in range(dim):
        # dissipative and random forces
        fd[i, d] = -gamma * v[i, d]
        fr[i, d] = noise/np.sqrt(dt) * np.random.normal()

    for j in range(i+1, npart):

        # conservative force for particle i
        fc[i, 0] = fc[i, 0] + (dX/r2) * fr
        fc[i, 1] = fc[i, 1] + (dY/r2) * fr
        fc[i, 2] = fc[i, 2] + (dZ/r2) * fr

        # conservative force for particle j (action-reaction)
        fc[j, 0] = fc[j, 0] - (dX/r2) * fr
        fc[j, 1] = fc[j, 1] - (dY/r2) * fr
        fc[j, 2] = fc[j, 2] - (dZ/r2) * fr

此处,伽马,噪声和dt是常数。我收到以下错误:

    fr[i, d] = noise/np.sqrt(dt)*np.random.normal()
TypeError: 'numpy.float64' object does not support item assignment

尽管如此,如果我在一个单独的外部循环中计算随机力和耗散力,则错误消失了:

for i in range(npart):
    for d in range(dim):
        fd[i, d] = -gamma * v[i, d]
        fr[i, d] = noise/np.sqrt(dt) * np.random.normal()

两种计算之间有什么区别?在单独的循环中完成计算时,为什么没有错误?

1 个答案:

答案 0 :(得分:0)

已解决:如@micric所指出,第二个循环内有一个名为“ fr”的变量,其类型为float。我犯了为数组使用相同名称的错误。因此,Python的抱怨。