本文乃Numpy Quickstart tutorial的翻译版本(并非完全翻译,翻译君为本人),英语能力足够的童鞋请阅读原文~,如果您觉得本文对您有帮助的话不要忘记点个赞哦!
numpy在进行一些操作时,有时数组会被复制到新的数组,但是有的时候并不会这样做,对于初学者来说,这可能很混乱。现在我们就来辨别一下这些情况吧!
一 不会复制到新的数组的情况
简单的赋值操作不会复制到新的数组中。
>>> a = np.arange(12) >>> b = a # no new object is created >>> b is a # a and b are two names for the same ndarray object True >>> b.shape = 3,4 # changes the shape of a >>> a.shape (3, 4)
python会将对象变为引用传递,因此传递数组的时候并不会创建一个新的数组,从下面可以看出,计算关于数组的函数的时候,两者的地址是相同的,也就是说函数里的数组引用指向的是原来的那个数组。
>>> def f(x): ... print(id(x)) ... >>> id(a) # id is a unique identifier of an object 148293216 >>> f(a) 148293216
二 View方法以及不完全复制
使用view方法可以创建一个新的数组对象,这个数组对象并不拥有自己的数据,而是可以“看到”并修改它看到的那部分数据。view的变形操作无法影响到原来的数组
>>> c = a.view() >>> c is a False >>> c.base is a # c is a view of the data owned by a True >>> c.flags.owndata False >>> >>> c.shape = 2,6 # a's shape doesn't change >>> a.shape (3, 4) >>> c[0,4] = 1234 # a's data changes >>> a array([[ 0, 1, 2, 3], [1234, 5, 6, 7], [ 8, 9, 10, 11]])
对数组的切片也返回了一个数组的view:
>>> s = a[ : , 1:3] # spaces added for clarity; could also be written "s = a[:,1:3]" >>> s[:] = 10 # s[:] is a view of s. Note the difference between s=10 and s[:]=10 >>> a array([[ 0, 10, 10, 3], [1234, 10, 10, 7], [ 8, 10, 10, 11]])
三 完全复制
copy方法提供了数组的复制方法,两个数组的地址不同,对一个数组的修改无法影响到另一个数组。
>>> d = a.copy() # a new array object with new data is created >>> d is a False >>> d.base is a # d doesn't share anything with a False >>> d[0,0] = 9999 >>> a array([[ 0, 10, 10, 3], [1234, 10, 10, 7], [ 8, 10, 10, 11]])
第三部分到此结束,如果觉得这一部分对您有帮助的话,请点赞。如果我的翻译哪里不妥,还请指出。