如何在不改变原始数组的情况下操作数组的副本?

3

我有一个名为n的数字数组,我的目标是创建一个名为m的数组,使得m[i] = n[i] - n[i-1]。m[0]的值等于n[0]。我尝试过以下方法:

import numpy as np
n = np.array([1,2,3,4])
m = n
for i in range(1, len(n)):
    m[i] = n[i] - n[i-1]

在for循环中的赋值操作让我有些不理解,因为它将n和m都变成了数组=[1 1 2 2]。我只想更改m中的输入值。
注意:当我像这样严格初始化n和m时,我的代码按照我的期望工作:
n = np.array([1,2,3,4])
m = np.array([1,2,3,4])

但我觉得我应该能够制作 n 的副本,并且只能操作副本。有任何建议或帮助吗?

在您的原始代码中,m 只是另一个指向 n 指向的同一个数组对象的引用。在您的第二个版本中,mn 指向不同的数组对象。 - couka
我明白了,所以它们指向同一个对象。谢谢! - plshelp
4个回答

1
通过执行m = n,你只是将一个名为m的新名称绑定到现有数组n上。这就是为什么当你稍后对m进行更改时,你会看到相同的更改应用于n。它们都引用内存中的同一对象。
要复制数组,应使用numpy.copy()方法:
m = np.copy(n)

1
m = copy.deepcopy(n) 是优秀的。 - NoName

0
使用copy()方法创建副本,而不修改原始数组,如下所示:
import numpy as np
n = np.array([1,2,3,4])
m = n.copy()
for i in range(1, len(n)):
    m[i] = n[i] - n[i-1]
print(m)
print(n)

输出:

[1 1 1 1]
[1 2 3 4]

SO有重复标志是有原因的。 - Mr. T

0
使用花式索引和numpy的强大功能。类似这样的代码可能会起作用。
m= n.copy()
m[1:] = n[1:] - n[:-1]
#m[0] = n[0] # not needed because m is originally a copy of n

n[1:] 将创建一个删除第一个元素的数组,然后进行数组求和操作。n[:-1] 将创建一个删除最后一个元素的数组。


NumPy的一个巨大优势是,在许多数组操作中,您不需要使用for循环,这样速度更快。 - Luis

0
尝试使用“m is n”,您会发现它们指向的是同一个对象,而不是副本。在Python中,变量只是指向底层对象的指针,因此在这个例子中,m和n都指向同一个数组对象,并且通过任一“名称”修改它都会修改同一个数组。您需要像m = n.copy()这样的东西。我不确定numpy中的确切语法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接