背景
这几天做竞赛遇到一个问题。本以为numpy的reshape方法肯定会新开辟一个内存空间以存放reshape后的结果,不料对reshape后的结果进行修改却同时改动了被reshape的变量。
思考
对于出现问题的那一行reshape代码,本就心存疑惑:reshape前后的shape一样,感觉没什么意义。转念一想是不是就是因为前后shape一样导致不再新开辟内存空间。下面的测试代码及运行结果验证了猜想。
验证
import numpy as np
a = np.array([[1,2,3],[2,3,4]])
b = a.reshape(2,3)
b[0][1] = 100
print(a)
aa = np.array([[1,2,3],[2,3,4]])
bb = aa.reshape(2,3).copy()
bb[0][1] = 100
print(aa)
aaa = np.array([[1,2,3],[2,3,4]])
bbb = aaa.reshape(3,2)
bbb[0][1] = 100 # 经评论区提醒,已经修改
print(aaa)
运行结果:
[[ 1 100 3]
[ 2 3 4]]
[[1 2 3]
[2 3 4]]
[[ 1 100 3]
[ 2 3 4]]
结论
之前的错误结论:
- reshape前后shape一样:不为reshape的结果开辟新的内存空间,修改其中一个变量同时会修改另一个变量;
- reshape前后shape不一样:为reshape的结果开辟新的内存空间,修改其中一个变量不会影响到另一个变量;
- 若reshape前后一样,又必须要开辟新的内存空间,可以采用copy()方法。
经评论区提醒,修改后的结论:
- reshape一般不会开辟新的内存空间,至于什么时候会开辟,有待探究。
- 如果要保证开辟新的空间,可以采用copy()方法。
最后感谢评论区大佬的纠正!