首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >`arr_2 = is `与`arr_2 = arr.view()`和`arr_ 2=arr.copy()‘之间的区别是什么?

`arr_2 = is `与`arr_2 = arr.view()`和`arr_ 2=arr.copy()‘之间的区别是什么?
EN

Stack Overflow用户
提问于 2021-11-23 07:34:35
回答 2查看 110关注 0票数 0

视图和副本的含义是不同的,如果您有视图,那么如果您更改了1,则另一个也应该更改;如果您有一个副本,则更改1不应影响到另一个视图。

生成数组的view/copy的方法有三种

代码语言:javascript
复制
arr_2 = arr
arr_2 = arr.view()
arr_2 = arr.copy()

他们三个似乎都返回了一个副本,我希望(视图,视图,副本)

为什么会这样呢?

编辑:我所说的copy的意思是,改变其中的任何一个不会改变另一个

我所说的view的意思是,改变乙醚1会改变另一个

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-24 08:47:04

代码语言:javascript
复制
In [488]: arr = np.array([1,2,3,4])
In [489]: arr2 = arr

更改arr2的元素也会更改arr,因为变量引用相同的数组:

代码语言:javascript
复制
In [490]: arr2[0]=100
In [491]: arr
Out[491]: array([100,   2,   3,   4])

执行arr2=np.array([3,4])将为arr2分配一个全新的数组,并删除它们通过489进行的任何连接。对于视图/副本来说,这不是一个有用的测试。

制作view

代码语言:javascript
复制
In [492]: arr2 = arr.reshape(2,2)
In [493]: arr2
Out[493]: 
array([[100,   2],
       [  3,   4]])
In [494]: arr2[0,0] = 200
In [495]: arr
Out[495]: array([200,   2,   3,   4])

arr2有一个不同的形状,但它仍然与arr共享数据缓冲区。我没有使用arr.view(),因为很少使用它;它没有做任何重要的事情。阅读view文档以了解原因。

副本使用自己的数据缓冲区生成一个新数组:

代码语言:javascript
复制
In [496]: arr2 = arr.copy()
In [497]: arr2[0] = 50
In [498]: arr2
Out[498]: array([50,  2,  3,  4])
In [499]: arr
Out[499]: array([200,   2,   3,   4])

arr2=np.array(arr)也将复制一份。比较它的文档和np.asarray

票数 1
EN

Stack Overflow用户

发布于 2021-11-23 08:08:21

在python中复制数组的三种方法

  • 赋值操作符(=):它只创建一个新变量,该变量共享原始对象
  • 浅拷贝(.view())的引用:在另一个对象中复制对象的引用。这意味着对对象副本所做的任何更改都反映在原始对象中。
  • 深层副本(.copy()):将对象的副本复制到另一个对象中。这意味着对对象副本所做的任何更改都不会反映在原始对象中。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70076965

复制
相关文章

相似问题

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