zoukankan      html  css  js  c++  java
  • NumPy 副本和视图


    章节


    数组副本是内容与原数组相同,存储在另一个内存位置的数组。

    数组视图是由原数组生成的另一个数组,但是与原数组共享数组元素内存,是对同一个内存位置所存储数组元素的不同呈现。

    数组引用是原数组的别名,与原数组是同一个数组。

    数组赋值

    NumPy中,把一个数组赋值给另一个数组,不会拷贝数组,赋值只是对原始数组的引用。对被赋值数组做的更改也会反映在原始数组中。

    id()函数返回数组的通用标识符,类似于C语言中的指针。

    示例

    import numpy as np  
      
    a = np.array([[1,2,3,4],[9,0,2,3],[1,2,3,19]])  
      
    print("原始数组:")
    print(a)
    print('
    ')  
      
    print("数组a的ID:", id(a))  
      
    b = a   
      
    print("
    赋值操作 b = a:")  
      
    print("
    b的ID:",id(b))  
      
    b.shape = 4,3;  
      
    print("
    b上的修改也反映到a上:")  
    print(a)  
    

    输出

    原始数组:
     [[ 1  2  3  4]
      [ 9  0  2  3]
      [ 1  2  3 19]]
    
    数组a的ID: 140377691416656
    
    赋值操作 b = a:
    
    b的ID: 140377691416656
    
    b上的修改也反映到a上:
    [[ 1  2  3]
     [ 4  9  0]
     [ 2  3  1]
     [ 2  3 19]]
     
    

    ndarray.view()

    view()方法返回新的数组对象,但数组元素数据与原始数组共享,因此是浅拷贝。与前面的情况不同,新数组的维数更改不会影响原数组的维数。

    示例

    import numpy as np  
      
    a = np.array([[1,2,3,4],[9,0,2,3],[1,2,3,19]])  
      
    print("原始数组:
    ",a)  
      
    print("
    a的ID:",id(a))  
      
    b = a.view()  
      
    print("
    b的ID:",id(b))  
      
    print("
    打印b的view")  
    print(b)  
      
    b.shape = 4,3;  
      
    print("
    b的维数更改不影响a")  
    print("
    原始数组 
    ",a)  
    print("
    view
    ",b)  
    
    
    b[0, 0] = 100
    
    print("
    b的元素更改会影响a")  
    print("
    原始数组 
    ",a)  
    print("
    view
    ",b)  
    
    

    输出

    
    原始数组:
     [[ 1  2  3  4]
     [ 9  0  2  3]
     [ 1  2  3 19]]
    
    a的ID: 140249104167360
    
    b的ID: 140249103376752
    
    打印b的view
    [[ 1  2  3  4]
     [ 9  0  2  3]
     [ 1  2  3 19]]
    
    b的维数更改不影响a
    
    原始数组
     [[ 1  2  3  4]
     [ 9  0  2  3]
     [ 1  2  3 19]]
    
    view
     [[ 1  2  3]
     [ 4  9  0]
     [ 2  3  1]
     [ 2  3 19]]
    
    b的元素更改会影响a
    
    原始数组
     [[100   2   3   4]
     [  9   0   2   3]
     [  1   2   3  19]]
    
    view
     [[100   2   3]
     [  4   9   0]
     [  2   3   1]
     [  2   3  19]]
     
    

    ndarray.copy()

    copy()返回原始数组的深层副本,该副本不与原始数组共享任何内存,是深拷贝。对数组副本所做的修改不会影响原始数组。

    示例

    import numpy as np  
      
    a = np.array([[1,2,3,4],[9,0,2,3],[1,2,3,19]])  
      
    print("原始数组:
    ", a)  
      
    print("
    a的ID:", id(a))  
      
    b = a.copy()  
      
    print("
    b的ID:", id(b))  
      
    print("
    打印b")  
    print(b)  
      
    b.shape = 4,3;  
      
    print("
    b的维数更改不影响a")  
    print("
    原始数组a 
    ", a)  
    print("
    数组副本b 
    ", b)  
    
    
    b[0, 0] = 100
    
    print("
    b的元素更改不影响a")  
    print("
    原始数组a 
    ", a)  
    print("
    数组副本b 
    ", b)  
    

    输出

    原始数组:
     [[ 1  2  3  4]
     [ 9  0  2  3]
     [ 1  2  3 19]]
    
    a的ID: 140312719819200
    
    b的ID: 140312509357872
    
    打印b
    [[ 1  2  3  4]
     [ 9  0  2  3]
     [ 1  2  3 19]]
    
    b的维数更改不影响a
    
    原始数组a
     [[ 1  2  3  4]
     [ 9  0  2  3]
     [ 1  2  3 19]]
    
    数组副本b
     [[ 1  2  3]
     [ 4  9  0]
     [ 2  3  1]
     [ 2  3 19]]
    
    b的元素更改不影响a
    
    原始数组a
     [[ 1  2  3  4]
     [ 9  0  2  3]
     [ 1  2  3 19]]
    
    数组副本b
     [[100   2   3]
     [  4   9   0]
     [  2   3   1]
     [  2   3  19]]
    
     
    
  • 相关阅读:
    Qt 6 正式发布
    GTK 4.0 正式发布
    编译 flink 1.12.0
    Flink 1.12.0 sql 任务指定 job name
    【翻译】Apache Flink 1.12.0 Release Announcement
    【源码】Flink 三层图结构 —— JobGraph 生成过程
    【源码】Flink 算子 chain 在一起的条件
    Web开发基础之CMDB系统开发之三
    Web开发基础之CMDB系统开发之二
    Ubuntu18.04升级至20.04
  • 原文地址:https://www.cnblogs.com/jinbuqi/p/11351802.html
Copyright © 2011-2022 走看看