numpy切片与索引的结果差异是什么?子数组为何是原数组视图?
NumPy切片、掩码与花式索引的视图特性详解
在NumPy里,有个很容易踩坑的关键特性:通过切片、掩码索引或者花式索引得到的子数组,本质上只是原数组的视图,并不是独立的副本。也就是说,修改这个子数组的内容,会直接同步到原数组上。我用实际代码给你演示这个特性:
python3 Python 3.5.2 (default, Nov 23 2017, 16:37:01) [GCC 5.4.0 20160609] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import numpy as np >>> np.__version__ '1.11.0' >>> # 切片操作示例:修改切片子数组,原数组同步变化 >>> a = np.arange(3); a[:2] = 111; a array([111, 111, 2]) >>> # 掩码索引示例:修改掩码选中的子数组,原数组同样变化 >>> a = np.arange(3); a[a<2] = 222; a array([222, 222, 2])
从上面的例子能明显看出来,不管用哪种方式获取子数组并修改,原数组都直接被改变了。这是因为视图和原数组共享同一块内存空间,NumPy这么设计是为了节省内存、提升效率。如果你需要的是独立的副本,记得调用子数组的.copy()方法,比如a[:2].copy(),这样修改副本就不会影响原数组了。
内容的提问来源于stack exchange,提问作者Leon
相关产品推荐
相关产品推荐

