首页 > 解决方案 > 用附加元素覆盖循环中的numpy数组

问题描述

我有许多我想更新的 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 (using ) 中的解决方案array[:] = ...也不起作用,因为附加的数组具有不同的长度。

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

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

标签: pythonarraysnumpyloops

解决方案


我不认为这是可能的。numpy.append等操作concatenate总是会创建 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 或其他东西来做到这一点,但我认为将整个事物存储为数组开始会更方便和)


推荐阅读