Python 子部分数组通过单个替换影响主数组,但矢量化时不影响主数组

Python 子部分数组通过单个替换影响主数组,但矢量化时不影响主数组,python,arrays,numpy,Python,Arrays,Numpy,为什么子部分数组通过单独替换影响主数组,但矢量化时不影响主数组 例如,如果代码为: import numpy as np Z =np.array( [[0,4,0,0,0,0], [0,0,0,1,0,0], [0,1,0,1,0,0], [0,0,1,1,0,0], [0,0,0,0,0,0], [0,0,0,0,0,0]]) print Z X= Z[1:4,0:3] X[0][0]=9 print X print Z #&l

为什么子部分数组通过单独替换影响主数组,但矢量化时不影响主数组

例如,如果代码为:

import numpy as np

Z =np.array( 
    [[0,4,0,0,0,0],
     [0,0,0,1,0,0],
     [0,1,0,1,0,0],
     [0,0,1,1,0,0],
     [0,0,0,0,0,0],
     [0,0,0,0,0,0]])
print Z

X= Z[1:4,0:3]
X[0][0]=9
print X
print Z  #<=== X affects Z
X=X*3+1
print X
print Z  #<=== X do not affect Z
将numpy导入为np
Z=np.数组(
[[0,4,0,0,0,0],
[0,0,0,1,0,0],
[0,1,0,1,0,0],
[0,0,1,1,0,0],
[0,0,0,0,0,0],
[0,0,0,0,0,0]])
打印Z
X=Z[1:4,0:3]
X[0][0]=9
打印X

print Z#这是因为切片Numpy数组会返回原始数组的视图,因此修改它也会影响原始数组

发件人:

通过基本切片生成的所有阵列始终为原始阵列 数组


这是因为切片Numpy数组会返回原始数组的视图,因此修改它也会影响原始数组

发件人:

通过基本切片生成的所有阵列始终为原始阵列 数组


X=X*3+1
不会修改原始数组,因为它不会就地修改
X

想象一下:

Y = X * 3 + 1
你不会期望这会改变原来的数组吧
X=X*3+1
是同一种表达式。它不会更改
X
本身,它只是将局部变量
X
的值更改为一个全新的数组

如果要修改原始阵列,可以执行以下操作:

X *= 3
X += 1

这将在
X
的内部操作,因此更改
Z

X=X*3+1
不会修改原始数组,因为它不会就地修改
X

想象一下:

Y = X * 3 + 1
你不会期望这会改变原来的数组吧
X=X*3+1
是同一种表达式。它不会更改
X
本身,它只是将局部变量
X
的值更改为一个全新的数组

如果要修改原始阵列,可以执行以下操作:

X *= 3
X += 1

这将在
X
的内部操作,因此改变
Z
,正如Ashwini Chaudhary所提到的,切片一个Numpy数组会返回原始数组的视图,但是当运行
X=X*3+1
时,X不再是Z的视图,X的引用会改变,因此,即使之后运行
X*=3
,也不会改变Z

,正如Ashwini Chaudhary所提到的,切片一个Numpy数组会返回原始数组的视图,但是当运行
X=X*3+1
时,X不再是Z的视图,X的引用会改变,因此,即使之后运行
X*=3
也不会改变Z

X=X*3+1是否也会修改原始数组?@user3211991否,因为您正在使用数学运算创建一个新数组,并将其分配给变量X try with
print id(X)
行的前后
X=X*3+1
@user3211991 X*3只需返回一个新数组,然后将
X
指向该新数组。它类似于:
a=b=[];b=2
,这无论如何都不会影响
a
。X=X*3+1是否也会修改原始数组?@user3211991否,因为您正在使用数学运算创建一个新数组,并将其分配给变量X try,使用
打印id(X)
行的前后
X=X*3+1
@user3211991 X*3只需返回一个新数组,然后将
X
指向该新数组。它类似于:
a=b=[];b=2,这无论如何都不会影响
a