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]])
    

      

  • 相关阅读:
    CPP STL学习笔记
    CPP 设计模式学习
    blackarch 安装指南
    通过 Http 请求获取 GitHub 文件内容
    实践
    升级
    部署-MySql 之Linux篇
    数据库
    RxJs
    Vue
  • 原文地址:https://www.cnblogs.com/zhangyafei/p/10567251.html
Copyright © 2011-2022 走看看