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