为何修改numpy数组切片的两种赋值方式对原数组影响不同?
NumPy数组赋值差异的原因解析
两段代码及现象
第一段代码
a = np.zeros([32,32]) b = np.index_exp[:3,:3] c = a[b] c=1
执行后数组
a仍全为0,不会因c的赋值操作改变。
第二段代码
a = np.zeros([32,32]) b = np.index_exp[:3,:3] c = a[b] c[:]=1
执行后数组
a发生了改变。
差异核心原因
- 第一段的
c=1是变量重新绑定:执行c = a[b]时,c指向了a切片生成的视图(NumPy切片默认返回视图,与原数组共享内存),但c=1直接把变量c的指向改成了整数1,彻底切断了和原数组视图的关联,所以对a无影响。 - 第二段的
c[:]=1是视图内容的原地修改:c[:]表示对c这个视图对应的原数组区域进行批量赋值,本质是直接修改了视图共享的a的内存数据,因此a会同步变化。
内容的提问来源于stack exchange,提问作者James Huang
相关产品推荐
相关产品推荐

