zoukankan      html  css  js  c++  java
  • Numpy系列(五)- 复制和视图

    当计算和操作数组时,它们的数据有时被复制到新的数组中,有时不复制。这里我们做个区分。

        完全不复制

    简单赋值不会创建数组对象或其数据的拷贝。

    import numpy as np
    a = np.arange(6)  
    a
    Out[165]: array([0, 1, 2, 3, 4, 5])
    b = a 
    id(a)
    Out[166]: 336914267312
    id(b) # id(a)和id(b)结果相同
    Out[167]: 336914267312
    b.shape =  3,2
    a.shape # 修改b形状,结果a的形状也变了
    Out[170]: (3, 2)
    b[0,0] = 12 #修改b的值,结果a的值也变化
    b
    Out[168]: 
    array([[12,  1],
           [ 2,  3],
           [ 4,  5]])
    a
    Out[169]: 
    array([[12,  1],
           [ 2,  3],
           [ 4,  5]])

     视图或浅复制

    不同的数组对象可以共享相同的数据。view方法创建一个新数组对象,该对象看到相同的数据。与前一种情况不同,新数组的维数更改不会更改原始数据的维数,但是新数组数据更改后,也会影响原始数据。

    c = a.view()
    c is a
    Out[171]: False
    c.base is a
    Out[172]: True
    c.flags.owndata
    Out[173]: False
    c.shape = 2,3 #c的维度更改,a的维度不变
    a.shape
    Out[174]: (3, 2)
    c[0,1] = 1234 #c的值变化,a的值也变化
    a
    Out[175]: 
    array([[  12, 1234],
           [   2,    3],
           [   4,    5]])

      深复制

    copy方法生成数组及其数据的完整拷贝。

    d = a.copy()
    d
    Out[176]: 
    array([[  12, 1234],
           [   2,    3],
           [   4,    5]])
    d is a
    Out[177]: False
    d.base is a
    Out[178]: False
    d[0,0] = 9999 #修改数组d的值,a不会受影响
    d
    Out[179]: 
    array([[9999, 1234],
           [   2,    3],
           [   4,    5]])
    a
    Out[180]: 
    array([[  12, 1234],
           [   2,    3],
           [   4,    5]])
    

      

  • 相关阅读:
    ie6-ie8中不支持opacity透明度的解决方法
    html5游戏-包围盒检测算法
    流媒体 8——因特网 tcp/ip
    流媒体 7——多媒体网络应用与交换
    流媒体 6——MPEG电视
    流媒体 5——MPEG声音
    流媒体 4——数字电视基础
    流媒体 3——彩色数字图像基础
    流媒体 2——数据无损压缩
    流媒体 1——概述+声音数字编码(pcm,dm......)
  • 原文地址:https://www.cnblogs.com/zhangyafei/p/10567251.html
Copyright © 2011-2022 走看看