NumPy 线性代数

NumPy 提供了线性代数函数库 linalg,该库包含了线性代数所需的所有功能,可以看看下面的说明:

函数 描述
dot 两个数组的点积,即元素对应相乘。
vdot 两个向量的点积
inner 两个数组的内积
matmul 两个数组的矩阵积
determinant 数组的行列式
solve 求解线性矩阵方程
inv 计算矩阵的乘法逆矩阵

1、numpy.dot()

numpy.dot() 对于两个一维的数组,计算的是这两个数组对应下标元素的乘积和(数学上称之为内积);对于二维数组,计算的是两个数组的矩阵乘积;对于多维数组,它的通用计算公式如下,即结果数组中的每个元素都是:数组a的最后一维上的所有元素与数组b的倒数第二位上的所有元素的乘积和: dot(a, b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m])。

 numpy.dot(a, b, out=None)

参数说明:

  • a : ndarray 数组
  • b : ndarray 数组
  • out : ndarray, 可选,用来保存dot()的计算结果

实例:

 import numpy as np
# 对于两个一维的数组,计算的是这两个数组对应下标元素的乘积和(数学上称之为内积)
x = np.arange(1, 5)
y = np.arange(2, 6)
print('x:\n', x)
print('y:\n', y)
print('a·b=', np.dot(x, y))
#对于二维数组,计算的是两个数组的矩阵乘积
a = np.matrix([[1, 2]])
b = np.matrix('2, 3;4, 5')
print('a:\n', a)
print('b:\n', b)
print(np.dot(a, b))

执行结果:

x:
[1 2 3 4]
y:
[2 3 4 5]
a·b= 40
a:
[[1 2]]
b:
[[2 3]
[4 5]]
[[10 13]]

2、numpy.vdot()

numpy.vdot() 函数是两个向量的点积。 如果第一个参数是复数,那么它的共轭复数会用于计算。 如果参数是多维数组,它会被展开

 import numpy as np
a = np.array([[1, 2], [3, 4]])
b = np.array([[11, 12], [13, 14]])
print('a:{}\nb:{}'.format(a, b))
# vdot 将数组展开计算内积
print(np.vdot(a, b))

执行结果:130

计算式:

1*11 + 2*12 + 3*13 + 4*14 = 130

3、numpy.inner()

numpy.inner() 函数返回一维数组的向量内积。对于更高的维度,它返回最后一个轴上的和的乘积

 import numpy as np
a = np.array([[1, 2], [3, 4]])
print('数组 a:')
print(a)
b = np.array([[11, 12], [13, 14]])
print('数组 b:')
print(b)
print('内积:')
print(np.inner(a, b))

执行结果:

数组 a:
[[1 2]
[3 4]]
数组 b:
[[11 12]
[13 14]]
内积:
[[35 41]
[81 95]]

内积计算式为:

1*11+2*12, 1*13+2*14

3*11+4*12, 3*13+4*14

4、numpy.matmul

numpy.matmul 函数返回两个数组的矩阵乘积。 虽然它返回二维数组的正常乘积,但如果任一参数的维数大于2,则将其视为存在于最后两个索引的矩阵的栈,并进行相应广播。

另一方面,如果任一参数是一维数组,则通过在其维度上附加 1 来将其提升为矩阵,并在乘法之后被去除。

对于二维数组,它就是矩阵乘法:

 import numpy as np
# 对于二维数组,它就是矩阵乘法
a = np.matrix([[1, 0], [0, 1]])
b = np.matrix([[4, 1], [2, 2]])
print('a:\n{}\nb:\n{}'.format(a, b))
print('a·b=', np.matmul(a, b))

执行结果:

a:
[[1 0]
[0 1]]
b:
[[4 1]
[2 2]]
a·b= [[4 1]
[2 2]]

二维和一维运算:

 import numpy.matlib
import numpy as np a = [[1,0],[0,1]]
b = [1,2]
print (np.matmul(a,b))
print (np.matmul(b,a))

执行结果:

[1  2]
[1 2]

维度大于二的数组 :

 import numpy as np 

 a = np.arange(8).reshape(2,2,2)
b = np.arange(4).reshape(2,2)
print (np.matmul(a,b))

执行结果:

[[[ 2  3]
[ 6 11]] [[10 19]
[14 27]]]、

6、numpy linalg模块

numpy.linalg模块包含线性代数的函数。使用这个模块,可以计算逆矩阵、求特征值、解线性方程组以及求解行列式等

6.1 numpy.linalg.inv()

numpy.linalg.inv() 函数计算矩阵的乘法逆矩阵。

逆矩阵(inverse matrix):设A是数域上的一个n阶矩阵,若在相同数域上存在另一个n阶矩阵B,使得: AB=BA=E ,则我们称B是A的逆矩阵,而A则被称为可逆矩阵。注:E为单位矩阵。

 import numpy as np
A = np.matrix('0, 1, 2;1, 0, 3;4, -3, 8')
print('A=', A)
# 使用inv函数计算逆矩阵
A_inv = np.linalg.inv(A)
print('矩阵A的逆矩阵:\n', A_inv)
# 检查原矩阵和求得的逆矩阵相乘的结果为单位矩阵
print('A·A_inv=\n', A*A_inv)

执行结果:

A= [[ 0  1  2]
[ 1 0 3]
[ 4 -3 8]]
矩阵A的逆矩阵:
[[-4.5 7. -1.5]
[-2. 4. -1. ]
[ 1.5 -2. 0.5]]
A·A_inv=
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]

# 注:矩阵必须是方阵且可逆,否则会抛出LinAlgError异常

6.2 numpy.linalg.solve()

numpy.linalg中的函数solve可以求解形如 Ax = b 的线性方程组,其中 A 为矩阵,b 为一维或二维的数组,x 是未知变量

 import numpy as np
#创建矩阵和数组
A = np.matrix([[1, 1, 1],
[4, 2, -5],
[2, 8, 7]])
b = np.array([6, -4, 27])
# 求解Ax=b的解
x = np.linalg.solve(A, b)
print('方程组解为:\n', x)
# 验证
print(np.dot(A, x))

执行结果:

方程组解为:
[ 2.97727273 -0.11363636 3.13636364]
[[ 6. -4. 27.]]

6.3   特征值和特征向量

# 特征值(eigenvalue)即方程 Ax = ax 的根,是一个标量。其中,A 是一个二维矩阵,x 是一个一维向量。特征向量(eigenvector)是关于特征值的向量

numpy.linalg模块中,eigvals函数可以计算矩阵的特征值,而eig函数可以返回一个包含特征值和对应的特征向量的元组

 import numpy as np
# 创建一个矩阵
A = np.mat("3 -2;1 0") print('调用eigvals函数求解特征值:')
a = np.linalg.eigvals(A)
print(a)
print('使用eig函数求解特征值和特征向量 (该函数将返回一个元组,按列排放着特征值和对应的特征向量,\
其中第一列为特征值,第二列为特征向量)')
a1, a2 = np.linalg.eig(A)
print(a1)
print(a2)
print('使用dot函数验证求得的解是否正确:') for i in range(len(a1)):
print("left:", np.dot(A, a2[:, i]))
print("right:", a1[i] * a2[:, i])

执行结果:

调用eigvals函数求解特征值:
[2. 1.]
使用eig函数求解特征值和特征向量 (该函数将返回一个元组,按列排放着特征值和对应的特征向量,其中第一列为特征值,第二列为特征向量)
[2. 1.]
[[0.89442719 0.70710678]
[0.4472136 0.70710678]]
使用dot函数验证求得的解是否正确:
left: [[1.78885438]
[0.89442719]]
right: [[1.78885438]
[0.89442719]]
left: [[0.70710678]
[0.70710678]]
right: [[0.70710678]
[0.70710678]]

6.4、numpy.linalg.det()

numpy.linalg.det() 函数计算输入矩阵的行列式。

行列式在线性代数中是非常有用的值。 它从方阵的对角元素计算。 对于 2×2 矩阵,它是左上和右下元素的乘积与其他两个的乘积的差。

换句话说,对于矩阵[[a,b],[c,d]],行列式计算为 ad-bc。 较大的方阵被认为是 2×2 矩阵的组合。

1 import numpy as np
2 a = np.array([[1,2], [3,4]])
3
4 print (np.linalg.det(a))

输出结果为:-2.0000000000000004

6.5.奇异值分解

# SVD(Singular Value Decomposition,奇异值分解)是一种因子分解运算,将一个矩阵分解为3个矩阵的乘积
# numpy.linalg模块中的svd函数可以对矩阵进行奇异值分解。该函数返回3个矩阵——U、Sigma和V,其中U和V是正交矩阵,Sigma包含输入矩阵的奇异值。

 import numpy as np
# 创建矩阵
D = np.mat("4 11 14;8 7 -2")
# 使用svd函数分解矩阵
U, Sigma, V = np.linalg.svd(D, full_matrices=False)
print('U:\n', U)
print('Sigma\n', Sigma)
print('V:\n', V)
# 使用diag函数生成完整的奇异值矩阵。将分解出的3个矩阵相乘
print('diag(Sigma):\n', np.diag(Sigma))
print(U * np.diag(Sigma) * V)

执行结果:

U:
[[-0.9486833 -0.31622777]
[-0.31622777 0.9486833 ]]
Sigma
[18.97366596 9.48683298]
V:
[[-0.33333333 -0.66666667 -0.66666667]
[ 0.66666667 0.33333333 -0.66666667]]
diag(Sigma):
[[18.97366596 0. ]
[ 0. 9.48683298]]
[[ 4. 11. 14.]
[ 8. 7. -2.]]

6.6 广义逆矩阵

 import numpy as np
# 创建一个矩阵
E = np.mat("4 11 14;8 7 -2")
print('使用pinv函数计算广义逆矩阵:')
pseudoinv = np.linalg.pinv(E)
print(pseudoinv)
print('将原矩阵和得到的广义逆矩阵相乘:')
print(E * pseudoinv)

执行结果:

使用pinv函数计算广义逆矩阵:
[[-0.00555556 0.07222222]
[ 0.02222222 0.04444444]
[ 0.05555556 -0.05555556]]
将原矩阵和得到的广义逆矩阵相乘:
[[ 1.00000000e+00 -9.29811783e-16]
[-1.66533454e-16 1.00000000e+00]]

19、NumPy——线性代数的更多相关文章

  1. NumPy线性代数

    NumPy - 线性代数 NumPy 包包含numpy.linalg模块,提供线性代数所需的所有功能. 此模块中的一些重要功能如下表所述. 序号 函数及描述 1. dot 两个数组的点积 2. vdo ...

  2. Numpy 线性代数

    Numpy 提供了线性代数库 linalg , 该库包含了线性代数所需的所有功能,可以看卡下面的说明: 函数 描述 dot 两个数组的点积, 即元素对应相乘 vdot 两个向量的点积 inner 两个 ...

  3. 吴裕雄--天生自然Numpy库学习笔记:NumPy 线性代数

    import numpy.matlib import numpy as np a = np.array([[1,2],[3,4]]) b = np.array([[11,12],[13,14]]) p ...

  4. [转]numpy线性代数基础 - Python和MATLAB矩阵处理的不同

    转自:http://blog.csdn.net/pipisorry/article/details/45563695 http://blog.csdn.net/pipisorry/article/de ...

  5. Day 19 numpy 模块

    numpy 模块(多维数组) import numpy as np arr=np.array([1,2,3,4],[5,6,7,8]) print(arr) #[[1 2 3 4] #[5 6 7 8 ...

  6. Python Numpy线性代数操作

    Python Numpy线性代数函数操作 1.使用dot计算矩阵乘法 import numpy as np from numpy import ones from __builtin__ import ...

  7. 掌握numpy(四)

    数组的累加(拼接) 在前面讲了使用切片方法能够对数组进行切分,使用copy对切片的数组进行复制,那么数组该如何拼接呢? a1 = np.full((2,3),1)#填充数组 a2 = np.full( ...

  8. Python之Numpy详细教程

    NumPy - 简介 NumPy 是一个 Python 包. 它代表 “Numeric Python”. 它是一个由多维数组对象和用于处理数组的例程集合组成的库. Numeric,即 NumPy 的前 ...

  9. Python数据分析之Numpy操作大全

    从头到尾都是手码的,文中的所有示例也都是在Pycharm中运行过的,自己整理笔记的最大好处在于可以按照自己的思路来构建矿建,等到将来在需要的时候能够以最快的速度看懂并应用=_= 注:为方便表述,本章设 ...

随机推荐

  1. MongoDB的使用学习之(一)开篇

    本人是菜鸟-1级,整理这个系列,之所以用整理,而不是写,是因为本人不是从头自己读源码,一个一个字母翻译过来的,而是记录整个学习过程,查看别人好的文章,收集好的资料,并有自己的一些项目代码,并从中得到点 ...

  2. iOS 应用配置及证书生成教程

    简介 首先你需要有一个苹果的开发者帐号,一台苹果电脑.点击查看苹果开发者账号注册流程 本教程需完成应用信息配置,包括如下两个基本配置: AppID Bundle ID 同时,生成 如下三个证书文件及对 ...

  3. Rsync+sersync部署

    内核版本:2.6.32-431.el6.x86_64 系统采用最小化安装,系统经过了基本优化,selinux 为关闭状态,iptables 为无限制模式 源码包存放位置:/root Rsync 客户端 ...

  4. 了解Greenplum (2)

    一.目的 1. 理解Greenplum中的数据分布策略(random 和 distribution),分析不同分布策略的优劣:2. 理解查询执行中的数据广播和数据重分布,分析在何种情况下选择哪种策略, ...

  5. Ansible自动化运维工具(2)

    (5) ping模块 检测客户端机器的连通性 ansible webserver -m ping (6) group模块 创建用户的附加组. ansible webserver -m group -a ...

  6. linux ab压力测试

    1.安装 yum -y install httpd-tools 2.检测版本 ab -V 3.常用 ab -c -n 127.0.0.1/index.php #同时处理100个请求并运行10次inde ...

  7. 14DBCP连接池

    实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程,为了解决此类性能问题,通常情况我们采用连接池技术,来共享连接Connection.这样我们就不需要每次都创建连接.释放连接了,这些操作 ...

  8. APKMirror - 直接下载google play里的应用

    APKMirror - Free APK Downloads - Download Free Android APKs #APKPLZ https://www.apkmirror.com/

  9. Linux telnet、nc、ping监测状态

    在工作中会遇到网络出现闪断丢包的情况,最终影响业务工常使用.可以业务服务器上发起监测. 1.通过telnet echo  -e  "\n" | telnet localhost 2 ...

  10. Vue.js 技术揭秘学习 (1) new Vue 发生了什么

    Vue 初始化主要就干了几件事情,合并配置,初始化生命周期,初始化事件中心,初始化渲染,初始化 data.props.computed.watcher 等等.