Python 为什么在numpy数组上使用*=会修改原始数组?
下面的代码演示了使用Python 为什么在numpy数组上使用*=会修改原始数组?,python,numpy,Python,Numpy,下面的代码演示了使用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语句没有修改。 我预计这两个作业都不会修改数据,因为a和b都被定义为数据片段,因此不应再链接。 这种行为是故意的吗?如果是这样,它背后的逻辑是什么?查看a和b上的标志,特别是OWNDATA标志 >
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
语句没有修改。
我预计这两个作业都不会修改数据
,因为a
和b
都被定义为数据片段,因此不应再链接。
这种行为是故意的吗?如果是这样,它背后的逻辑是什么?查看
a
和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
>a.flags
C_:对
F_:对
OWNDATA:False#>>b.flags
C_:对
F_:对
OWNDATA:True#查看a
和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
>a.flags
C_:对
F_:对
OWNDATA:False#>>b.flags
C_:对
F_:对
OWNDATA:True#我认为这并不特定于numpy,而是适用于任何可变对象。例如,请参见以下修改列表(原型可变对象)的代码:
因此,赋值将创建一个副本,而操作符(+=)将修改对象。numpy对象只是以同样的方式工作。我认为这不是特定于numpy的,而是适用于任何可变对象。例如,请参见以下修改列表(原型可变对象)的代码:
因此,赋值将创建一个副本,而操作符(+=)将修改对象。numpy对象的行为方式完全相同