简单记录一下最近遇到的一个bug,利用numpy生成的矩阵在复制时不能直接赋值,而是要用copy方法。直接赋值类似于把内存中的地址 (即指针) 给了目标变量,其与被赋值变量共享同一块内存,这样做可以节省内存空间。而copy则不同,会重新申请一块内存,分配给复制后的新变量,在该变量上的操作不会对愿变量产生影响。

下面看一个例子,

1
2
3
4
5
6
7
8
9
10
import numpy as np
x = np.arange(9.).reshape(3,3)
# copy
y = x.copy()
y[y>=5] = 0
# 赋值法
z = x
z[z>=5] = 0

其输出结果如下,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
In [6]: y
Out[6]:
array([[0, 1, 2],
[3, 4, 0],
[0, 0, 0]])
In [7]: x
Out[7]:
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
In [8]: z
Out[8]:
array([[0, 1, 2],
[3, 4, 0],
[0, 0, 0]])
In [9]: x
Out[9]:
array([[0, 1, 2],
[3, 4, 0],
[0, 0, 0]])

可以看到,采用copy后,对y的操作不会影响到原矩阵x,而采用直接赋值后,对z的操作对x产生了影响。