首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Numpy数组:虽然A= B[:]创建一个具有id(A) != id(B)的numpy数组对象A。它仍然会被更新,不像列表

Numpy数组:虽然A= B[:]创建一个具有id(A) != id(B)的numpy数组对象A。它仍然会被更新,不像列表
EN

Stack Overflow用户
提问于 2021-10-11 10:33:23
回答 2查看 31关注 0票数 0

我试图使用numpy数组做一个浅拷贝,就像我通常对列表所做的那样。但是,我发现这与列表的行为不一样。我知道我可以使用.copy()方法来解决这个问题。但我只是想了解一下,在这里,蒙皮的引擎盖下发生了什么。有谁能详细说明一下。

代码语言:javascript
复制
import numpy as np
a = np.array([1,2,3,4,5])
b = a[:]
print(id(b) == id(a))  # Ids are different, So different objects right ?
b[3] = 10
print(a, b) # Both a and b got updated
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-11 10:40:29

来自关于切片的文档(重点是我的):

注意,数组片并不复制内部数组数据,而是只生成原始数据的新视图。--这与列表或元组切片不同,如果不再需要原始数据,建议使用显式副本()。

所以就这么做吧:

代码语言:javascript
复制
import numpy as np

a = np.array([1, 2, 3, 4, 5])
b = a.copy()
b[3] = 10
print(a, b)

输出

代码语言:javascript
复制
[1 2 3 4 5] [ 1  2  3 10  5]

注意,ids不同的原因是因为ba的视图,实际上是一个不同的对象。

票数 2
EN

Stack Overflow用户

发布于 2021-10-11 10:40:50

numpy中的操作符[:]不复制数据,而是复制引用。所以这种行为是预料之中的。这与直接执行a = b相同。使用np.copy(array)复制值。

如果有数组a = [1, 2]和空变量b,那么numpy数组的赋值行为总结如下:

  1. 这类赋值将复制引用,因此如果您稍后更改b,它也将更改a
代码语言:javascript
复制
b = a
b[1] = 10
print(b == a) # True
代码语言:javascript
复制
b = a[:]
b[1] = 10
print(b == a) # True
  1. 这种赋值将复制,因此如果稍后更改b,则a不会更改。
代码语言:javascript
复制
b = np.copy(a)
b[1] = 10
print(b == a) # True

...and如果dtype=object,使用deepcopy()从包copy将确保所有的值被复制。

代码语言:javascript
复制
b = copy.deepcopy(a)
b[1] = 10
print(b == a) # True
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69524780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档