python - TypeError: 'numpy.float64' 对象不支持项目分配 - 类似的代码,错误引发
问题描述
我正在编写分子动力学代码,为此我有一个计算粒子之间力的函数:保守力、随机力和耗散力。保守力是成对力,这意味着我有一个双循环来计算它们。我想节省一些时间,并将随机力和耗散力的计算包括在双循环的一个循环中,如下所示:
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
这里 gamma、noise 和 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()
两种计算有什么区别?为什么在单独的循环中进行计算时没有错误?
解决方案
已解决:正如@micric 指出的那样,第二个循环中有一个名为“fr”的变量,它的类型为浮点数。我犯了对数组使用相同名称的错误。因此 Python 的抱怨。
推荐阅读
- javascript - 将 ESlint 与 expressjs 一起使用
- javascript - 在 MVC 中向 bootstrapTable 添加删除按钮
- stata - Stata:删除非唯一重复项
- visual-studio - 我们如何在 Visual Studio 中更改工具窗口标题栏的高度?
- python - 当我从 Django 中的查询中删除所有项目时,项目 ID 不会重置
- aspnetboilerplate - 如何解决 VS-2019 上的调试错误
- docker - Windows 10上的docker撰写问题
- android - 在 Android 中构建 Apache Ftp 服务器。它总是列出导演。需要从 Assets 渲染 html 页面
- c# - Task.Wait 到所有自己的类型化任务
- c++ - 有没有办法在 COM 指针对象的执行线程中强制同步销毁?