Python Numpy 快速入门指导 (三) 理清numpy什么时候会复制出一个新的数组?

    本文乃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]])

    第三部分到此结束,如果觉得这一部分对您有帮助的话,请点赞。如果我的翻译哪里不妥,还请指出。




猜你喜欢

转载自blog.csdn.net/yuweiming70/article/details/79674659