子部分数组通过单独替换影响主数组,但在向量化时不影响主数组

时间:2014-01-22 14:27:02

标签: 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  #<=== X affects Z
X=X*3+1
print X
print Z  #<=== X do not affect Z

3 个答案:

答案 0 :(得分:3)

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

来自docs

  

基本切片生成的所有数组始终是原始数据的views   阵列。

答案 1 :(得分:3)

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

想象:

Y = X * 3 + 1

你不会指望这会改变原来的阵列,对吗? X = X * 3 + 1是同一种表达方式。它不会更改X本身,它只是将局部变量X的值更改为全新的数组。

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

X *= 3
X += 1

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

答案 2 :(得分:0)

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