下面的代码演示了使用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)
gives:
[[3 0] [3 4]]
the a*=3
语句修改了矩阵数据,但是b=b*3
声明没有。
我预计这两个作业都不会修改data
既a
and b
被定义为数据切片,因此不应再链接。
这种行为是故意的吗?如果是这样,其背后的逻辑是什么?
看看上面的标志a
and b
,特别是 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进入数组。
修改内容就会修改data
.
这种行为是故意的吗?如果是这样,其背后的逻辑是什么?
是的,这是设计使然。除非必要,否则它的目的是防止复制。如果您需要 numpy 中的副本,请明确请求a = data[0].copy()
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)