zoukankan      html  css  js  c++  java
  • numpy中的浅复制和深复制

      浅复制:主要有两种方式,简单的赋值或者使用视图(view)

      简单的赋值:其实就是制造了一个别名,数组并没有被copy成新的一份,当使用其中一个别名改变数组值的时候,另一个别名对应的值一并改变。  

    >>>a = np.arange(12)
    >>>a
    array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
    >>>b = a
    >>>b is a
    True
    >>>b.shape = 3,4
    >>>b
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])
    >>>a
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])
    

      

      视图:就是制造了一个原数组的在numpy中定义为view的东西,新视图的base是原数组,区别在于新视图可以和原数组有不同的shape,但当视图的值改变,原数组的值也会发生改变。需要注意的是数组的切片其实就是生成视图的过程。如c = a[:],其实就是生成了和a形状相同的a的view(完全切片)。

    >>>a
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])
    >>>c = a.view
    >>>c is a
    False
    >>>c.base is a
    True
    >>>c.shape = 12
    >>>c[0] = 520
    >>>a
    array([[520,   1,   2,   3],
           [  4,   5,   6,   7],
           [  8,   9,  10,  11]])
    

      

      深复制:就是制作一份原数组的copy了。

    >>>d = a.copy()
    >>>d[0][0] = 1314
    >>>d
    array([[1314,    1,    2,    3],
           [   4,    5,    6,    7],
           [   8,    9,   10,   11]])
    >>>a
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])
  • 相关阅读:
    Codeforces Round #555 (Div. 3) A B C1(很水的题目)
    蓝桥杯国赛之阶乘位数
    POJ-1258 Agri-Net(最小生成树)
    昂贵的聘礼(枚举区间+最短路)
    地斗主(矩阵快速幂)
    救救兔子(二分)
    shell编程之sed编辑器&gawk程序
    typedef struct与struct的区别
    iOS内存管理编程指南
    Object c 基础知识
  • 原文地址:https://www.cnblogs.com/chester-cs/p/11839601.html
Copyright © 2011-2022 走看看