gpt4 book ai didi

python - `y = x` 和 `y = x[:]` 与 x numpy-ndarray 有什么区别?

转载 作者:行者123 更新时间:2023-12-03 14:31:13 24 4
gpt4 key购买 nike

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

>>> import numpy as np
>>> x = np.array([1])
>>> y = x
>>> x.flags.writeable = False
>>> y[0] = 5
Traceback (most recent call last):
File "<pyshell#42>", line 1, in <module>
y[0] = 5
ValueError: assignment destination is read-only
>>> del x, y
>>> x = np.array([1])
>>> y = x[:]
>>> x.flags.writeable = False
>>> y[0] = 5
>>> x
array([5])
(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 的数据持有可写 View .
>>> x.flags.writeable, y.flags.writeable
(True, True)
>>> x.flags.writeable = False
>>> x.flags.writeable, y.flags.writeable
(False, True)
请注意,如果您关闭 writeable复制前标记 x ,那么该副本也将取消设置可写标志,您将拥有一个只读浅拷贝。

关于python - `y = x` 和 `y = x[:]` 与 x numpy-ndarray 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66551489/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com