gpt4 book ai didi

python - 为什么在 numpy 数组上使用 *= 会修改原始数组?

转载 作者:太空宇宙 更新时间:2023-11-04 09:48:29 25 4
gpt4 key购买 nike

以下代码演示了使用 a*=3 会修改原始数据集,而 a=a*3 不会:

data=np.array([[1,0],[3,4]])
a=data[0]
b=data[1]
a*=3
b=b*3
print(data)

给出:

[[3 0] [3 4]]

a*=3 语句修改了矩阵数据,但是b=b*3 语句没有。我希望这两个赋值都不会修改 data,因为 ab 都被定义为数据片段,因此不应再链接。这种行为是故意的吗?如果是,其背后的逻辑是什么?

最佳答案

查看ab 上的标志,特别是OWNDATA 标志

>>> a.flags
C_CONTIGUOUS : True
F_CONTIGUOUS : True
OWNDATA : False # <--- a does not copy data (a*=3 mutates original data)
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False
>>> b.flags
C_CONTIGUOUS : True
F_CONTIGUOUS : True
OWNDATA : True # <--- b is copied (the multiplication b*3 creates the copy)
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False

对象 data[0] 不是切片,它是数组中的可写 View 。 修改内容将修改数据

Is this behaviour intended? If so, what is the logic behind it?

是的,这是设计使然。除非必要,否则它旨在防止复制。如果您需要 numpy 中的副本,请使用 a = data[0].copy() 明确请求。

关于python - 为什么在 numpy 数组上使用 *= 会修改原始数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48871320/

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