【问题标题】:"resetting" variable in for loop pythonfor循环python中的“重置”变量
【发布时间】:2013-04-25 17:47:49
【问题描述】:

我想从 python 中的数组中减去一个数字,但我想保留原始数组。

这是我的代码:

for X0 in [X0 * 0.01 for X0 in range(-2,2)]:
    for Y0 in [Y0 * 0.01 for Y0 in range(6,10)]:
        RAm = RA
        Decm = Dec
        RAm[:] = [x - X0 for x in RAm]
        Decm[:] = [x - Y0 for x in Decm]
        RAs = np.sum(RAm)
        Decs = np.sum(Decm)
        #a = np.sqrt(((RAs**2*Decs**2)**2 - RAs**4*Decs**4)/(RAs**2*Decs**2*Decs**2 -Decs**2*RAs**4))
        #b = np.sqrt(((RAs**2*Decs**2)**2 - RAs**4*Decs**4)/(RAs**2*Decs**2*RAs**2 - RAs**2*Decs**4))
        print RA
        print RAm

这让我知道 RA 正在发生变化,即使它应该保持不变,因为我想在每个循环中从 RA 中减去一个不同的数字。我该如何解决这个问题?

【问题讨论】:

  • 您是否将numpy.arrays 与常规lists 混合使用?如果是,为什么?

标签: python arrays loops for-loop


【解决方案1】:

如果您仍然在使用 NumPy,则可以利用它支持同时对所有元素进行操作这一事实。

RAm = np.array(RA) - X0
Decm = np.array(Dec) - Y0

或者甚至跳过那些作业,如果您没有将结果用于除总和之外的任何内容:

RAs = np.sum(np.array(RA) - X0)
Decs = np.sum(np.array(Dec) - Y0)

我的印象是你是一个(Python)初学者,所以也许坚持使用基本的 Python,直到你觉得舒服为止。当然,所有这些都可以在没有 NumPy 的情况下完成:

RAs = sum(x - X0 for x in RA)
Decs = sum(y - Y0 for y in Dec)

但是,如果您确实想使用 NumPy,请正确使用它。这意味着:使用矩阵计算而不是循环。例如,您可以执行以下操作* 以获取具有不同 Y0 值的总和的 array

Y0_values = np.array([Y0 * 0.01 for Y0 in range(6,10)])
y_matrix = np.tile(RA, [len(Y0_values), 1])
Y0_matrix = np.tile(Y0_values[np.newaxis].T, [1, len(RA)])
sums = np.sum(y_matrix - Y0_matrix, axis=1)

*仅用于演示目的。我远不是 NumPy 专家,所以可能有更好的方法来做到这一点。出于同样的原因,我不会解释它是如何工作的。我只是鼓励你更多地了解 NumPy,这对你有好处。

【讨论】:

    【解决方案2】:

    不要遍历列表并对其进行更改,而是这样做:

    for element in list(your_list_here):
        if element.something():
            your_list_here.remove(element)
    

    另外.. 分配Ram=Ra 意味着对对象的每个方法调用,实际上是指同一个对象。如果您想安全,请使用Ram = list(Ra)

    【讨论】:

      【解决方案3】:

      RAm = RA 使RAm 成为RA 的别名; RAm[:] = ... 修改列表。

      相反,只做

      RAm = [x - X0 for x in RA]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-14
        相关资源
        最近更新 更多