美文网首页
Numpy 简单教程(三)Numpy中的深复制、浅复制与视图(V

Numpy 简单教程(三)Numpy中的深复制、浅复制与视图(V

作者: 超级超级小天才 | 来源:发表于2020-08-16 17:02 被阅读0次

更过的Numpy教程连载内容:https://www.jianshu.com/nb/47449944

Numpy中的深复制、浅复制与视图(View)

不复制的情况

  • 赋值操作不会对数组进行复制

    a = np.array([1,2,3,4])
    b = a
    
    ------
    
    print(b is a)
    True
    
  • Python中的传递操作传递的是引用,所以不会进行复制,比如函数操作

    def f(x):
        print(id(x))
    
    print(id(a))
    f(a)
    
    ------
    
    2838517155760
    2838517155760
    

浅复制与视图(view)

  • 不同的数组对象可能有公共的数据,可以使用 view 操作在不对某一个数组进行复制的情况下创建一个同样指向该数据的视图,这会是一个新的对象,但是会和原来的数组共享数据,这被称之为浅复制(shallow copy):

    a=np.array([1,2,3,4])
    c=a.view()
    
    print(c is a)
    print(c.base is a)
    
    c = c.reshape((2,2))
    print(c.shape)
    print(a.shape)
    
    c[0,1] = 1000
    print(a)
    
    ------
    
    False
    True
    
    (2, 2)
    (4,)
    
    [1    1000    3    4]
    
  • 对一个数组进行切片(slice)操作时,会返回该数组的一个视图,也就是进行了浅复制:

    a = np.array([[1,2,3],[4,5,6]])
    s = a[:,0:2]
    s[:]=1000
    print(a)
    
    ------
    
    [[1000 1000    3]
     [1000 1000    6]]
    

深复制

使用copy操作对数组进行深复制(deep copy),也就是实在地复制一份新的数据:

a = np.array([[1,2,3,4,5,6]])
b = a.copy()
print(b is a)
print(b.base is a)

b = b.reshape((2,3))
print(b.shape)
print(a.shape)

b[0,1:3] = 1000
print(b)
print(a)

------

False
False

(2, 3)
(1, 6)

[[   1 1000 1000]
    [   4    5    6]]
[[1 2 3 4 5 6]]

相关文章

网友评论

      本文标题:Numpy 简单教程(三)Numpy中的深复制、浅复制与视图(V

      本文链接:https://www.haomeiwen.com/subject/glztjktx.html