微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

`y = x` 和 `y = x[:]` 之间有什么区别,x 是一个 numpy-ndarray?

如何解决`y = x` 和 `y = x[:]` 之间有什么区别,x 是一个 numpy-ndarray?

我正在阅读关于不可变 numpy 数组的 this 问题,并且在对其中一个答案的评论中,有人表明在使用 y = x[:] 而不是 {{1} 时给定的技巧不起作用}.

y = x

(Python 3.7.2,numpy 1.16.2)

这两者之间到底有什么区别,为什么在这种特定情况下它们的行为如此不同?

编辑:this 没有回答我的问题,因为它只询问使用列表的情况,我想知道为什么 numpy ndarray 显示这种特殊的行为,其中取决于复制修改数据的方法有时会和有时不会引发错误

解决方法

y = x 只是添加了对现有对象的另一个引用,这里没有复制。这只是将同一对象的另一个名称添加到本地命名空间中,因此它的行为方式与 x 相同。

y = x[:] 创建 numpy 数组的浅拷贝。这是一个新的 Python 对象,但内存中的底层数组数据将是相同的。但是,这些标志现在是独立的:

>>> x = np.array([1])
>>> y = x[:]
>>> x.flags.owndata,y.flags.owndata
(True,False)

owndata 标志表明 y 只是对 x 数据的一个视图。在 x 上设置可写标志不会改变 y 的标志,因此 y 仍然持有对 x 数据的可写视图。

>>> x.flags.writeable,y.flags.writeable
(True,True)
>>> x.flags.writeable = False
>>> x.flags.writeable,y.flags.writeable
(False,True)

请注意,如果您在复制 writeable 之前关闭 x 标志,那么该副本也将具有未设置的可写标志,并且您将拥有只读浅拷贝。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。