【问题标题】:Overwriting numpy array in loop with appended elements用附加元素覆盖循环中的numpy数组
【发布时间】:2021-04-17 07:48:49
【问题描述】:

我有许多想要更新的 numpy 数组。对于它们中的每一个,我想在末尾附加第一个元素的副本:

array_ = np.append(array_, array_[0])

由于它们很多,因此使用某种循环会很方便。如何循环执行这个更新操作?

我尝试过使用类似的东西

for array_ in [array_1, array_2, array_3]:
    array_ = np.append(array_, array_[0])

但是,这不会覆盖原始数组,因为array_ = ... 不会将其视为列表。 How to update multiple Numpy arrays in a loop 的解决方案(使用array[:] = ...)也不起作用,因为附加数组的长度不同。

我也尝试转换为列表和其他解决方法,但不知何故,我总是发现在某些时候我必须制作一个副本,以免原始数组被覆盖。

这可以通过覆盖原始数组的方式来完成吗?

【问题讨论】:

    标签: python arrays numpy loops


    【解决方案1】:

    我认为这是不可能的。 numpy.appendconcatenate 等操作总是会创建 numpy 数组的副本,并且不会就地执行修改操作。例如,你也许可以考虑做这样的事情 -

    import numpy as np
    
    array_1 = np.random.rand(100)
    array_2 = np.random.rand(100)
    array_3 = np.random.rand(100)
    
    arr_list = [array_1, array_2, array_3]
    for i in range(len(arr_list)):
        arr_list[i] = np.append(arr_list[i], arr_list[i][0])
    
    print(array_1.shape)
    

    您明确告诉您希望修改存储在特定索引中的数组,但即使在这种情况下,操作也会创建一个新副本并简单地存储对列表的新引用。

    现在,如果您可以就地执行附加操作,那么这样的事情就可以了。但你不能,因为 numpy 的运作方式。

    一般来说,改变数组原始大小的操作永远不能原地执行。它总是创建一个新副本并将其分配给相关变量。而且我认为如果不修改数组就可以做到这一点。

    我的建议是根本不要使用变量array_i,只将所有数组存储为一个列表。在那种情况下,你不会有这个问题。

    (发布了这个,我不确定是否有一些奇怪的方法可以通过直接将计算的输出分配给特定的 ID 或其他东西来做到这一点,但我认为将整个东西存储为一个更方便数组开始)

    【讨论】:

    • 感谢您的回答!我想我最终找到了一种适合您括号漏洞的方法。 (参考我的回答)
    【解决方案2】:

    不确定这是多么pythonic,但我找到了一个解决方案:将数组名称作为字符串迭代并使用globals()[array_name_] 访问变量:

    for array_name_ in ["array_1", "array_2", "array_3"]:
        globals()[array_name_] = np.append(globals()[array_name_], globals()[array_name_][0])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-16
      • 2020-09-14
      • 1970-01-01
      • 1970-01-01
      • 2018-05-19
      • 2020-07-07
      • 2019-05-06
      • 2016-10-20
      相关资源
      最近更新 更多