百度PaddlePaddle入门-6 (Numpy应用)


 

线性代数

Numpy中实现了线性代数中常用的各种操作,并形成了numpy.linalg线性代数相关的模块。其中包括:

  • diag 以一维数组的形式返回方阵的对角线(或非对角线)元素,或将一维数组转换为方阵(非对角线元素为0)
  • dot 矩阵乘法
  • trace 计算对角线元素的和
  • det 计算矩阵行列式
  • eig 计算方阵的特征值和特征向量
  • inv 计算方阵的逆
 1 # 矩阵相乘
 2 a = np.arange(12)
 3 b = a.reshape([3, 4])
 4 c = a.reshape([4, 3])
 5 # 矩阵b的第二维大小,必须等于矩阵c的第一维大小
 6 d = b.dot(c) # 等价于 np.dot(b, c)
 7 print('a: 
{}'.format(a))
 8 print('b: 
{}'.format(b))
 9 print('c: 
{}'.format(c))
10 print('d: 
{}'.format(d))
a: 
[ 0  1  2  3  4  5  6  7  8  9 10 11]
b: 
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
c: 
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]
d: 
[[ 42  48  54]
 [114 136 158]
 [186 224 262]]
下面为补充资料:
A
的矩阵,B
的矩阵,那么称
的矩阵C为矩阵AB的乘积,记作
,其中矩阵C中的第
行第
列元素可以表示为: [1] 
如下所示:
1 # numpy.linalg  中有一组标准的矩阵分解运算以及诸如求逆和行列式之类的东西
2 # np.linalg.diag 以一维数组的形式返回方阵的对角线(或非对角线)元素,
3 # 或将一维数组转换为方阵(非对角线元素为0)
4 e = np.diag(d)
5 f = np.diag(e)
6 print('d: 
{}'.format(d))
7 print('e: 
{}'.format(e))
8 print('f: 
{}'.format(f))
d: 
[[ 42  48  54]
 [114 136 158]
 [186 224 262]]
e: 
[ 42 136 262]
f: 
[[ 42   0   0]
 [  0 136   0]
 [  0   0 262]]
1 # trace, 计算对角线元素的和
2 g = np.trace(d)
3 g
440
1 # det,计算行列式
2 h = np.linalg.det(d)
3 h
1.3642420526593978e-11
一个n×n的方阵A的行列式记为det(A)或者|A|,一个2×2矩阵的行列式可表示如下:
把一个n阶行列式中的元素aij所在的第i行和第j列划去后,留下来的n-1阶行列式叫做元素aij的余子式,记作Mij。记Aij=(-1)i+jMij,叫做元素aij代数余子式。例如:
一个n×n矩阵的行列式等于其任意行(或列)的元素与对应的代数余子式乘积之和,即 [1]  :
1 # eig,计算特征值和特征向量
2 i = np.linalg.eig(d)
3 i
(array([4.36702561e+02, 3.29743887e+00, 3.13152204e-14]),
 array([[ 0.17716392,  0.77712552,  0.40824829],
        [ 0.5095763 ,  0.07620532, -0.81649658],
        [ 0.84198868, -0.62471488,  0.40824829]]))
设 A 是n阶方阵,如果存在数m和非零n维列向量 x,使得 Ax=mx 成立,则称 m 是矩阵A的一个特征值(characteristic value)或本征值(eigenvalue)。
1 # inv,计算方阵的逆
2 tmp = np.random.rand(3, 3)
3 j = np.linalg.inv(tmp)
4 tmp, j
(array([[0.06156638, 0.49923069, 0.24846698],
        [0.32714403, 0.00291609, 0.29544213],
        [0.98688912, 0.23833271, 0.73339648]]),
 array([[-1.69687265, -7.62795567,  3.64773546],
        [ 1.28349546, -4.97212032,  1.56813898],
        [ 1.86628413, 11.88029355, -4.05462716]]))


Numpy保存和导入文件

Numpy还可以方便的进行文件读写,比如对于下面这种格式的文本文件:

1 # 使用np.fromfile从文本文件'housing.data'读入数据
2 # 这里要设置参数sep = ' ',表示使用空白字符来分隔数据
3 # 空格或者回车都属于空白字符,读入的数据被转化成1维数组
4 d = np.fromfile('./work/housing.data', sep = ' ')
5 d,d.size,d.shape
(array([6.320e-03, 1.800e+01, 2.310e+00, ..., 3.969e+02, 7.880e+00,
        1.190e+01]), 7084, (7084,))
注意到shape输出的形式。
Numpy还提供了save和load接口,直接将数组保存成文件(保存为.npy格式),或者从.npy文件中读取数组。
 1 # 产生随机数组a
 2 a = np.random.rand(3,3)
 3 np.save('a.npy', a)
 4 
 5 # 从磁盘文件'a.npy'读入数组
 6 b = np.load('a.npy')
 7 
 8 # 检查a和b的数值是否一样
 9 check = (a == b).all()
10 check
True
原文地址:https://www.cnblogs.com/yuzaihuan/p/12270072.html