【问题标题】:How to avoid overwriting when appending updated matrices to a list?将更新的矩阵附加到列表时如何避免覆盖?
【发布时间】:2020-09-11 06:05:04
【问题描述】:

我会尽量简单地解释这个... 以下代码取自我定义的函数。 我正在为每一步更新值R,我知道这可以正常工作。 R 是一个矩阵,我需要将每个更新的矩阵添加到列表R_list_eq。当我打印列表时,我确实得到了一个矩阵列表,但它们都是一样的,所以我猜代码在某个地方被覆盖了。

R_list_eq = []

R, V, F, box_width = md.initialize_particles(n_atoms, temperature, rho, eps)

for n in range(20000):
    R += dt * V + 0.5 * dt**2 * F
    if n > 10000:
        R_list_eq.append(R)

【问题讨论】:

  • 您需要附加一个副本,即R_list_eq.append(R.copy())。否则所有条目都引用同一个(更新的)对象。
  • 尝试使用R = R + 而不是R +=。一些对象被+=修改了
  • 您希望 R 何时重置为 initialize_particles 返回的元组的第一个值?
  • for 循环结束时,您将多个引用附加到名称R 分配给的最后一个对象。尝试附加其当前值的 copy。您可以使用copy 模块来执行此操作,或者可能有一些更快或更简单的方法,具体取决于R 对象的确切含义(如字典或列表-“矩阵”不是本机Python 类型)。跨度>
  • 另见article关于对象与名称。

标签: python list matrix variable-assignment


【解决方案1】:

如果声明if n > 10000 and R not in R_list_eq:,我已经编辑了你,这将避免覆盖。

R_list_eq = []

R, V, F, box_width = md.initialize_particles(n_atoms, temperature, rho, eps)

for n in range(20000):
    R += dt * V + 0.5 * dt**2 * F
    if n > 10000 and R not in R_list_eq:
        R_list_eq.append(R)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    • 2016-03-12
    • 2021-08-25
    • 1970-01-01
    相关资源
    最近更新 更多