【问题标题】:How can I manipulate a copy of an array without changing the original array? [duplicate]如何在不更改原始数组的情况下操作数组的副本? [复制]
【发布时间】:2021-02-11 12:37:23
【问题描述】:

我有一个名为 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 指向不同的数组对象。
  • 我明白了,所以它们指向同一个对象。谢谢!

标签: python arrays numpy


【解决方案1】:

通过执行m = n,您只需将新名称m 绑定到名为n 的现有数组。这就是为什么当您稍后对m 进行更改时,您会看到应用于n 的相同更改。它们都引用内存中的同一个对象。

要制作数组的副本,您应该使用numpy.copy() 方法:

m = np.copy(n)

【讨论】:

  • m = copy.deepcopy(n) 更胜一筹。
【解决方案2】:

使用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 有重复标志是有原因的。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    使用精美的索引和 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循环,这样会快很多
    猜你喜欢
    • 2021-06-09
    • 2022-11-12
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 2017-09-29
    • 2018-01-12
    • 1970-01-01
    • 2019-10-26
    相关资源
    最近更新 更多