美文网首页【完】Numpy学习笔记
【numpy笔记_11】线性代数、深浅拷贝

【numpy笔记_11】线性代数、深浅拷贝

作者: fakeProgramer | 来源:发表于2023-03-21 18:24 被阅读0次

    今天介绍一下numpy在线性代数方面的计算,使用并不复杂都是调用方法。用到的同学记一记,用不到跳过也无妨。

    显而易见笔者一般用不到,所以到网上找了资料汇总在下面。


    线性代数运算

    函数 描述
    dot 两个数组的点积
    vdot 两个向量的点积
    inner 两个数组的内积
    matmul 两个数组的矩阵积
    linalg.det 计算输入矩阵的行列式
    linalg.solve 求解线性矩阵方程
    linalg.inv 计算矩阵的逆矩阵

    使用时直接向函数传入数组对象,像这样:

    import numpy as np
    arr1 = np.arange(1,12,2).reshape(2, 3)
    arr2 = np.arange(2,13,2).reshape(3, 2)
    arr3 = np.arange(13,24,2).reshape(2, 3)
    print('arr1数组:\n', arr1)
    print('arr2数组:\n', arr2)
    print('arr3数组:\n', arr3)
    print('arr1和arr2的点积 dot:\n', np.dot(arr1, arr2))
    print('arr1和arr3的内积 inner:\n', np.inner(arr1, arr3))
    # 运行结果:
    arr1数组:
     [[ 1  3  5]
     [ 7  9 11]]
    arr2数组:
     [[ 2  4]
     [ 6  8]
     [10 12]]
    arr3数组:
     [[13 15 17]
     [19 21 23]]
    arr1和arr2的点积 dot:
     [[ 70  88]
     [178 232]]
    arr1和arr3的内积 inner:
     [[143 197]
     [413 575]]
    

    深拷贝和浅拷贝

    deepcopy,如果python基础学的不错应该知道怎么个事。
    简言之,拷贝就是复制一份数据,包含深拷贝和浅拷贝。深拷贝是创建一份新的数据,值相同但地址不同,两组数据完全独立;浅拷贝则是复制数据的地址,原数据变化时,副本数据跟着变化。
    举个例子,深拷贝好比克隆一个你;而浅拷贝则是镜子中的你,是个地址映射关系
    python的copy模块能够操作数据的深拷贝。看个例子:

    import copy
    res1 = [1,3,5,7]
    res2 = res1   #直接赋值就是浅拷贝
    res2_deep = copy.deepcopy(res1)    # deepcopy()方法,深拷贝
    print('res1的值为:', res1, '地址为:', id(res1))
    print('res2的值为:', res2, '地址为:', id(res2))
    print('res2_deep的值为:', res2_deep, '地址为:', id(res2_deep))
    print('- '*20)
    
    res1[0] = 333
    print('操作更改res1为:', res1, '此时res2为', res2, '此时res2_deep为', res2_deep)
    # 运行结果:
    res1的值为: [1, 3, 5, 7] 地址为: 104956480
    res2的值为: [1, 3, 5, 7] 地址为: 104956480
    res2_deep的值为: [1, 3, 5, 7] 地址为: 104956160
    - - - - - - - - - - - - - - - - - - - - 
    操作更改res1为: [333, 3, 5, 7] 此时res2为 [333, 3, 5, 7] 此时res2_deep为 [1, 3, 5, 7]
    

    在实例中,深拷贝下更改原数据并未对新拷贝的数据产生影响。好比阿伟被胖揍一顿,镜子里的他鼻青脸肿,而克隆的阿伟未受影响一个道理。

    那么转入numpy的正题。

    使用numpy涉及庞大的数组操作、运算,如果没弄清深浅拷贝的概念,很容易操作错误。
    numpy中封装了copy的思想,因此可以直接调用copy方法实现对数组的深拷贝:

    import numpy as np
    arr1 = np.array([1,3,5,7])
    arr2 = arr1
    arr2_deep = np.copy(arr1)
    print('arr1的值为:', arr1, '地址为:', id(arr2))
    print('arr2的值为:', arr2, '地址为:', id(arr2))
    print('arr2_deep的值为:', arr2_deep, '地址为:', id(arr2_deep))
    print('- '*20)
    
    arr1[0] = 333
    print('操作更改arr1:', arr1, '此时arr2为', arr2, '此时arr2_deep为', arr2_deep)
    # 运行结果:
    arr1的值为: [1 3 5 7] 地址为: 90937824
    arr2的值为: [1 3 5 7] 地址为: 90937824
    arr2_deep的值为: [1 3 5 7] 地址为: 91245024
    - - - - - - - - - - - - - - - - - - - - 
    操作更改arr1: [333   3   5   7] 此时arr2为 [333   3   5   7] 此时arr2_deep为 [1 3 5 7]
    

    有关线代和数据拷贝的知识就总结到这里。

    线代中涉及的数学概念如点积、向量、矩阵等,这里并未过多介绍,有兴趣的同学可以再找资料翻看一下,未来使用numpy进行科学运算时会更加得心应手。

    相关文章

      网友评论

        本文标题:【numpy笔记_11】线性代数、深浅拷贝

        本文链接:https://www.haomeiwen.com/subject/qgumrdtx.html