• Python机器学习(四十八)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]]
  • 相关阅读:
    thinkphp3.1.3验证码优化
    php导出数据为CSV文件DEMO
    python学习笔记十七:base64及md5编码
    linux运维笔记
    [转]如何像Python高手(Pythonista)一样编程
    用gulp清除、移动、压缩、合并、替换代码
    [蓝桥杯][2017年第八届真题]小计算器(模拟)
    [蓝桥杯][2017年第八届真题]发现环(基环树输出环)
    [蓝桥杯][2017年第八届真题]合根植物(并查集)
    省赛训练5-3(四个签到题)
  • 原文地址:https://www.cnblogs.com/huanghanyu/p/13162056.html
Copyright © 2020-2023  润新知