【完】Numpy学习笔记

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

2023-03-21  本文已影响0人  fakeProgramer

今天介绍一下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进行科学运算时会更加得心应手。

上一篇下一篇

猜你喜欢

热点阅读